|
本帖最后由 sunsili 于 2021-12-17 15:00 编辑
Linux TCPIP server报Socket accept: Invalid argument再次运行报端口占用
问题现象: server(服务端)运行在accept函数处等待client的连接,当有client来连接时,accept函数返回值为-1(错误). 报错 Socket accept: Invalid argument 问题偶尔出现 Ctrl+c 退出后,再运行报端口占用 请教大神问题何在?感谢万分。11
代码如下:
- //多进程的方式
- //服务器端 server.c
- #include <stdio.h>
- #include <unistd.h>
- #include <string.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <arpa/inet.h>
- #include <netinet/in.h>
- #include <stdlib.h>
- #define SERVER_PORT 1234 //1024以前是系统内部占用
- #define SERVER_IPADDR "192.168.31.76" //注意:IP地址需要和自己Ubuntu系统里面的IP地址,设置为同网段的。
- #define LISTEN_Q_MAX 10 //服务器能够连接的客户端总个数。
- //typedef 类型别名 int a char b;
- typedef struct sockaddr_in SIN;
- int Socket(int domain,int type,int protocol);
- int Bind(int sockfd,SA* my_addr,int addrlen);
- int Listen(int s,int backlog);
- int Accept(int s,SA* addr,int *addrlen);
- //声明全局变量
- char t_buf[64];
- char r_buf[64];
- char clientname[64];
- int r_len;
- int main(int argc,char* argv[])
- {
- pid_t pid;
- int serfd,clifd;
- int addrlen;
- int reuse=1;
- SIN seraddr,cliaddr;
-
- //1、创建一个用于TCP通信的端口
- serfd = Socket(AF_INET,SOCK_STREAM,0);
-
- //2、编写服务器的地址信息
- bzero(&seraddr,sizeof(SIN)); //功能之前用的memset()
- seraddr.sin_family = AF_INET;
- seraddr.sin_port = htons(SERVER_PORT); //配置端口号
- seraddr.sin_addr.s_addr=inet_addr(SERVER_IPADDR); //对IP地址传进来
-
- setsockopt(serfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse)); //不是必须的
-
- //3、端口和服务器进行绑定
- Bind(serfd,(SA*)&seraddr,sizeof(SA));
-
- //4、创建监听队列
- Listen(serfd,LISTEN_Q_MAX);
-
- //5、等待客户端连接,获取客户端信息
- while(1)
- {
- clifd = Accept(serfd,(SA*)&cliaddr,&addrlen);
- //等待被连接
- //clifd=accept(serfd,(SA*)&cliaddr,&addrlen);
- if(clifd == -1)
- {
- perror("accept failed\r\n");
- exit(0);
- }
-
-
-
- printf("Connect already.client%d\r\n",clifd);
-
- pid = fork();
- if(pid == 0)
- {
- //子进程
- read(clifd,clientname,sizeof(clientname));
- while(1)
- {
- //子进程 --处理当前客户端的事务
- r_len = read(clifd,r_buf,sizeof(r_buf));
- if(r_len == 0)
- {
- close(clifd);
- printf("client %s offline\r\n",clientname);
- exit(0);
- }
- printf("recv from client %s:%sr\n",clientname,r_buf);
-
- }
- }
- close(clifd);
- close(serfd);
- }
- int Socket(int domain,int type,int protocol)
- {
- int serfd; //局部变量
- serfd = socket(domain,type,protocol); //核心
- if(serfd == -1)
- {
- perror("socket failed\r\n");
- exit(-1);
- }
- return serfd;
- }
- int Bind(int sockfd,SA* my_addr,int addrlen)
- {
- int ret;
- ret = bind(sockfd,my_addr,addrlen);
- if(ret == -1)
- {
- perror("bind failed\r\n");
- exit(-1);
- }
- return 0;
- }
- //监听函数
- int Listen(int s,int backlog)
- {
- int ret;
- ret = listen(s,backlog);
- if(ret == -1)
- {
- perror("listen failed\r\n");
- exit(-1);
- }
- return 0;
- }
- //等待接收客户端函数
- int Accept(int s,SA* addr,int *addrlen)
- {
- int ret;
- ret = accept(s,addr,addrlen);
- if(ret == -1)
- {
- perror("accept failed\r\n");
- exit(-1);
- }
- return ret;
- }</p>
复制代码
|
+10
|