鸣涧_GC96O 发表于 2021-9-7 00:04:15

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]
查看完整版本: Linux TCPIP server报Socket accept: Invalid argument再次运行报端口占用