Linux上的网络编程-初探

#include <stdio.h>

#include <string.h>

#include <unistd.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <pthread.h>

#include <semaphore.h>

#include <wait.h>

#include <signal.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <sys/ipc.h>

#include <sys/sem.h>

#include <semaphore.h>

#include <sys/msg.h>

#include <sys/shm.h>

#include <sys/un.h>

#include <sys/time.h>

#include <sys/select.h>

#include "doublyList.h"

#include "array.h"

myListOP * fdList;

struct info{

struct sockaddr_in client_addr;

int fd;

};

void printInt( int*a){

printf("%d",a);
}
struct info
creatInfo(struct sockaddr_in client_addr,int fd){
struct info
ret = malloc(sizeof(struct info));

if (client_addr)

{

ret->client_addr=*client_addr;

}

else{

memset(&ret->client_addr,0,sizeof(struct sockaddr_in));

}

复制代码
ret->fd = fd;
return ret;

}

void printInfo(struct info* info){

static char ip_human16 = {0};

if (info ==0 || (&(info->client_addr)==0))

{

return;

}

复制代码
int port_human=ntohs(info->client_addr.sin_port);
inet_ntop(AF_INET,&info->client_addr.sin_addr,ip_human,16);
printf("ip:%s,port:%d,fd:%d::",ip_human,port_human,info->fd);

}

int serverfun(struct info* info){

int client = info->fd;

char ip_human16={0};

int port_human=0;

struct sockaddr_in client_addr = {0};

client_addr = info->client_addr;

inet_ntop(AF_INET,&client_addr.sin_addr,ip_human,16);

port_human=ntohs(client_addr.sin_port);

char buf64 = "";

int res = read(client,buf,64);

if (res == 0)

{

printf("客户端已断开连接:\nIP:%s\nport:%d\n",ip_human,port_human);

close(client);

fdList->del(fdList,fdList->find(fdList,info,0));

return 0;

}

printf("客户端IP:%s\nport:%d\n发来消息:%s\n",ip_human,port_human,buf);

return 1;

}

int main(int argc, char const *argv\[\])

{

if (argc<2)

{

printf("请输入端口号\n");

return 1;

}

复制代码
int server = socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in addr={0};
addr.sin_family=AF_INET;
addr.sin_port=htons(atoi(argv[1]));
addr.sin_addr.s_addr=inet_addr("0.0.0.0");

if(bind(server,(struct sockaddr * )&addr,sizeof(addr))==-1){
    perror("bind:");
    return 1;
}
struct sockaddr_in client_addr = {0};
int client_len = sizeof(client_addr);

int ret;
int max = 10;
listen(server,max);
char ip_human[16]="";
int port_human = 0;
//创建监视列表
fd_set fd_listen;
FD_ZERO(&fd_listen);
int client;
fdList = myListDInit((void(*)(void*))printInt);
struct info * currentinfo=0;
int* currentfd =0;
unsigned int i=0;

fdList->append(fdList,creatInfo(0,server));

printf("服务器正在运行:\n");
for (;;)
{
    i=0;
    while (currentinfo = (struct info*)fdList->slice(fdList,i++))
    {
        currentfd = &currentinfo->fd;
        FD_SET(*currentfd,&fd_listen);//重置fd表
    }

    select(max,&fd_listen,0,0,0);//让服务器阻塞,等待
    //似乎有问题,select不一定有东西可以操作
    //解除阻塞时一定有东西可以操作
    i=0;
    while (currentinfo = fdList->slice(fdList,i++))
    {
        currentfd = &currentinfo->fd;
        if (*currentfd == server&&FD_ISSET(*currentfd,&fd_listen))//有新的客户端连接
        {
            

            client = accept(server,(struct sockaddr * )&client_addr,&client_len);

            fdList->append(fdList,creatInfo(&client_addr,client));

            inet_ntop(AF_INET,&client_addr.sin_addr,ip_human,16);
            port_human=ntohs(client_addr.sin_port);
            printf("客户端已连接:\nIP:%s\nport:%d\n",ip_human,port_human);
            continue;
        }
        //客户端操作
        else{
            serverfun(currentinfo);
        }
        
    }
    
    
    

}  
return 0;

}

相关推荐
Lsetea1 分钟前
curl设置SSL_CERT_FILE仍报60:CURL_CA_BUNDLE与CA路径优先级排查
linux·https·ssl证书·openssl·curl
红姐跨境书11 分钟前
TikTok 爬虫实战指南:避开 TikTok 反爬机制的 7个坑
网络
隐擎fox15 分钟前
Linux eBPF 与 XDP 高性能网络出口架构:动态连接追踪、丢包诊断与住宅网关 QoS 调优实战
linux·网络·网络协议·tcp/ip·架构
Multipath71234 分钟前
多链路聚合设备:助力智慧农业发展的网络基石——让农田网络不断连,让智能设备不失控
网络·网络协议·5g·udp·无人机
似是燕归来38 分钟前
Rtthread OS 功能开发之 socket udp协议程序开发
网络·stm32·网络协议·udp·socket·rtthread
xiaoliuliu123451 小时前
Linux 手动装毕昇 bisheng-jdk-8u432-linux-aarch64.tar.gz
linux
饿了吃洗衣凝珠1 小时前
red hot day1
网络
牧羊人.3331 小时前
自然语言处理基础 04|长短期记忆网络 LSTM
网络·人工智能·rnn·深度学习·学习·自然语言处理·lstm
lambo mercy1 小时前
Day4:流式传输
运维·服务器·网络
狂奔的sherry1 小时前
JRuby 多线程反引号偶发 127:GC 提前释放了 posix_spawn 的 argv
java·linux·ruby·gc·jruby