_yirol 2015-12-15 10:28 采纳率: 42.9%
浏览 3209
已结题

请问socket 我的accept() 为什么出错了?

望大神指点迷津
服务端:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
//#include<mysql/mysql.h>

#define server_port 5000
#define MAXPENDING 1000 
struct USERDATA
{
    char name[30];
    char passwd[30];
}USERDATA;
int HandleTCPClient(int clntSocket,struct USERDATA *userdata);
int HandleTCPClient(int clntSocket,struct USERDATA *userdata)
{
    char buffer[BUFSIZ];
    ssize_t  numBytesRcvd = recv(clntSocket,buffer,BUFSIZ-1,0);
    if(numBytesRcvd < 0)
    {
        fputs("recv() failed!\n",stderr);
    //  send(clntSocket,"false",(size_t)strlen("false"),0);
        return -1;
    }
    memcpy(userdata,buffer,sizeof(buffer));
    return 0;
}
void main()
{
    int servSock;
    if((servSock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP)) < 0)
    {
        printf("socket() failed!\n");
        exit(1);
    }
    struct sockaddr_in servAddr;
    memset(&servAddr,0,sizeof(servAddr)) ;
    servAddr.sin_family = AF_INET;
    servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servAddr.sin_port = htons(server_port);

    if(bind(servSock,(struct sockaddr *)&servAddr,sizeof(servAddr)) <0)
    {
        printf("bind() failed!\n");
        exit(1);
    }
    if(listen(servSock,MAXPENDING) < 0)
    {
        printf("listen() failed!\n");
        exit(1);
    }
    for(;;)
    {
        struct sockaddr_in clntAddr;
        socklen_t clntAddrLen = sizeof(clntAddr);
        int clntSock = accept(servSock,(struct sockaddr *)&clntAddr,&clntAddrLen);
        if(clntSock < 0)
        {
            fputs("accpet() failed!\n",stderr);
            continue;
        }
        char clntName[INET_ADDRSTRLEN];
        if(inet_ntop(AF_INET,&clntAddr.sin_addr.s_addr,clntName,sizeof(clntName)) == NULL)
            fputs("Unable to get client address!\n",stderr);
        struct USERDATA  userdata;
        int result = HandleTCPClient(clntSock,&userdata);
        if(result < 0)
        {
    //      send(clntSock,"false",(size_t)strlen("false"),0);
            close(clntSock);
        }
        else
        {
    //      send(clntSock,"true",(size_t)strlen("true"),0);
            close(clntSock);
            puts(userdata.name);
            puts(userdata.passwd);
        }

    }
}


客户端:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<arpa/inet.h>

struct USERDATA
{
    char name[30];
    char passwd[30];
};
void DieWithUserMessage(const char *msg,const char *detail);
void DieWithSystemMessage(const char *msg);
void DieWithUserMessage(const char *msg,const char *detail){

    fputs(msg,stderr);
    fputs(": ",stderr);
    fputs(detail,stderr);
    fputc('\n',stderr);
    exit(1);
}
void DieWithSystemMessage(const char *msg){
    perror(msg);
    exit(1);
}
int main(){

    char *servIP = "139.129.39.131";

    in_port_t servPort = 5000;
    int sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);

    if(sock < 0)
        DieWithSystemMessage("socket() failed!\n");

    struct sockaddr_in servAddr;
    memset(&servAddr,0,sizeof(servAddr));
    servAddr.sin_family = AF_INET;

    int rtnVal = inet_pton(AF_INET,servIP,&servAddr.sin_addr.s_addr);

    if(rtnVal == 0)
        DieWithUserMessage("inet_pton() failed!","invalid address string");

    servAddr.sin_port = htons(servPort);

    if(connect(sock,(struct sockaddr *)&servAddr,sizeof(servAddr)) < 0)
        DieWithSystemMessage("connect() failed!\n");

    struct USERDATA userdata;
    memcpy(userdata.name,"kakarot",sizeof("kakarot"));
    memcpy(userdata.passwd,"1235656",sizeof("1235656"));
    ssize_t numBytes = send(sock,(char *)&userdata,sizeof(userdata),0);

    if(numBytes < 0)
        DieWithSystemMessage("send() failed!\n");
    else if(numBytes != sizeof(userdata))
        DieWithUserMessage("send()","sent unexpected number of bytes");

    //unsigned int totalBytesRcvd = 0;
    fputs("Received: ",stdout);


    char buffer[BUFSIZ];

/*  numBytes = recv(sock,buffer,BUFSIZ -1,0);

    if(numBytes < 0)
        DieWithSystemMessage("recv() failed!\n");
    else if(numBytes == 0)
        DieWithUserMessage("recv()","connection closed prematurely!");

    fputc('\n',stdout);

    close(sock);
    exit(0);


}

  • 写回答

2条回答 默认 最新

  • majinbo111 2015-12-15 13:00
    关注

    之前遇过类似问题,告诉你如何调试吧:
    1、先保证服务端是可以监听到客户端请求,如何验证呢?可以打印一下服务端接收的客户端的ip地址,先建议你客户端在服务端都在本机(IP
    :127.0.0.1)上进行
    2、在试着向客户端服务器互相发送与接收数据
    最好的调试方式就是打印!

    评论

报告相同问题?

悬赏问题

  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号
  • ¥50 安装pyaudiokits失败
  • ¥15 计组这些题应该咋做呀
  • ¥60 更换迈创SOL6M4AE卡的时候,驱动要重新装才能使用,怎么解决?
  • ¥15 让node服务器有自动加载文件的功能
  • ¥15 jmeter脚本回放有的是对的有的是错的
  • ¥15 r语言蛋白组学相关问题
  • ¥15 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺