首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

socket 中accept函数有关问题

2013-01-06 
socket 中accept函数问题我遇见的问题及解决方法昨晚写了个socket程序,最简单的服务端和客户端由于我的客

socket 中accept函数问题
我遇见的问题及解决方法

昨晚写了个socket程序,最简单的服务端和客户端

由于我的客户端是个一次性的程序,连接一次服务端就会自动推出,然后重新运行./client后才能再次连接服务端

我发现第一次客户端连接服务端的时候,服务端打印的客户端地址是一个非127.0.0.1,是不对的!端口号为1023,如下图:socket 中accept函数有关问题

 

开始我以为是我的服务端中的用户accept函数的sockaddr_in 结构体没有初始化造成的,后来我加入了bzero(&cin,sizeof(cin));语句用于cin结构体的初始化

然后我发现第一次连接变成了0.0.0.0,端口也为0!为什么?

百度了一下才发现一个人的socket程序中在调用accept函数前,先给accept函数需要的参数len赋值

len = sizeof(cliaddr);

然后再调用accept

fc = accept(listenfd, (struct sockaddr *) &cin, &len);

测试后果然不错了!这样就知道我的错误在于accept函数的参数错误!

 

accept函数

查了我当前系统(Linux 2.6.35.14-106.fc14.i686)的头文件,在/Usr/include/Sys/socket.h中这样定义了accept函数

        fc = accept(fs,(struct sockaddr*)&cin , NULL);        if(fc < 0)        {               printf("fc==%d\n",fc);            return -1;         }   


运行时发现运行到这儿退出了,打印了fc==-1!由此可见,最后一个参数不为NULL最好!(可能是系统版本不同导致的)

 

我的server.c
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<arpa/inet.h>#define MAX_LINE 100#define PORT 8000void my_fun(char *p);/*大写字符转换为小写字母*/void my_fun(char *p){    if(p == NULL)        return ;    for ( ;*p != '\0';p++ )    {        if(*p >= 'A' && *p <= 'Z')        {            *p = *p - 'A' + 'a';        }    }}int main(int argc , char **argv){    struct sockaddr_in sin;    struct sockaddr_in cin;    int fs, fc;  //创建套接字用,服务端和客户端各一个    socklen_t len;    char buf[MAX_LINE];    char addr_p[INET_ADDRSTRLEN];//用来保存客户端ip信息    int n;    bzero(&sin,sizeof(sin));    bzero(&cin,sizeof(cin));    sin.sin_family = AF_INET;    sin.sin_addr.s_addr = INADDR_ANY;  //服务端接受任意地址    sin.sin_port = htons(PORT);    fs = socket(AF_INET,SOCK_STREAM,0); //服务端套接字,tcp协议    bind(fs,(struct sockaddr*)&sin,sizeof(sin));    listen(fs,10);    printf("=========welcome to jack's server=========\n");    memset(addr_p,0,sizeof(addr_p));    while (1)    {        len = sizeof(cin);//len 必须赋值,否则得到的第一个客户端地址为0.0.0.0!        printf("len == %d\n",len);        fc = accept(fs,(struct sockaddr*)&cin , &len);        //fc = accept(fs,(struct sockaddr*)&cin , NULL);//尽量不要为NULL        if(fc < 0)        {            printf("fc==%d\n",fc);            return -1;        }        n = read(fc,buf,MAX_LINE); //读取的长度为n        inet_ntop(AF_INET,&cin.sin_addr,addr_p,sizeof(addr_p));        printf("client ip:%s,port:%d\n",addr_p,ntohs(cin.sin_port));        printf("content:%s\n",buf);        my_fun(buf);        write(fc,buf,n);        close(fc);    }    if(close(fs) == -1)    {        perror("fail to close\n");        exit(1);    }    return 1;}


好好学习,天天向上!!

 

 

 

热点排行