Linux TCPIP server报Socket accept: Invalid argument再次运行报端口占用
本帖最后由 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;
char r_buf;
char clientname;
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>
页:
[1]