代码之家  ›  专栏  ›  技术社区  ›  user3252048

c套接字编程出错?[已关闭]

  •  -1
  • user3252048  · 技术社区  · 11 年前
    int acceptSocket;
    struct sockaddr_in addr, client, dest;
    char buf[256];
    long rc, sentbytes;
    int port = 18017;
    
    int CreateSocket()
    {
    
    
    
        if(rc!=0)
    
           {
    
             printf("socket failure code: %ld\n",rc);
    
             return 1;
    
           }
    
           else
    
           {
    
             printf("socket started!\n");
    
           }
    
           // Socket creation for UDP
    
           acceptSocket=socket(AF_INET,SOCK_DGRAM,0);
    
           if(acceptSocket==-1)
    
           {
    
             printf("Failure: socket creation is failed, failure code\n");
    
             return 1;
    
           }
    
           else
    
           {
    
             printf("Socket started!\n");
    
           }
    
         memset(&addr, 0, sizeof(addr));
    
         addr.sin_family=AF_INET;
    
         addr.sin_port=htons(port);
    
         addr.sin_addr.s_addr=htonl(INADDR_ANY);
    
         rc=bind(acceptSocket,(struct sockaddr*)&addr,sizeof(addr));
    
         if(rc==-1)
    
         {
    
           printf("Failure: listen, failure code:\n");
    
           return 1;
    
         }
    
         else
    
         {
    
           printf("Socket an port %d \n",port);
    
         }
    
    
    
    
           while(rc!=-1)
           {
             rc=recvfrom(acceptSocket,buf, 256, 0, (struct sockaddr*) &client, sizeof(client));
             if(rc==0)
             {
               printf("Server has no connection..\n");
               break;
             }
             if(rc==-1)
             {
               printf("failure: recv, failure code\n");
               break;
             }
             XcpIp_RxCallback( (uint16) rc, (uint8*) buf, (uint16) port );
    
    
                makeTimer("First Timer", &firstTimerID, 2, 2);   //2ms
                makeTimer("Second Timer", &secondTimerID, 10, 10);    //10ms
                makeTimer("Third Timer", &thirdTimerID, 100, 100);  //100ms
    
         //    buf[rc]='\0';
         //    printf("Client sendet: %s\n",buf);
         //    sprintf(buf2,"Du mich auch %s",buf);
         //    rc=sendto(connectedSocket,buf2,strlen(buf2),0);
    
           }
    
    
           close(acceptSocket);
    
    
    
           return 0;
    
         }
    

    我为udp层创建了一个套接字,它正在等待来自客户端的连接,然后将数据发送到客户端。我的程序在侦听模式下崩溃。即:绑定后:我收到错误

     printf("Failure: listen, failure code:\n");
    

    有人能告诉我为什么吗? @约阿希姆·皮莱堡:它不起作用!!同样的问题。我无法就此发表评论。

    1 回复  |  直到 11 年前
        1
  •  -1
  •   Jayesh Bhoi    11 年前

    首先,您需要查找实际错误。您可以执行以下操作

    作为绑定手册页

    出现错误时,返回-1,并正确设置errno。

    每个POSIX调用中的标准过程都有一个名为errno的整数,其中包含实际错误的值。您可以手动检查其值,也可以将原语用作 perror 或strerror

    if (rc  == -1) 
    {
        perror("socket error");
    }
    

    必须具有 #include<errno.h>

    现在绑定失败有很多原因

    可能有其他应用程序正在侦听该端口

    netstat -a | grep "18017"
    

    所以,如果您发现端口正在使用,请切换到另一个端口号,或者干脆终止使用该端口的进程。

    也请更新您 while...loop 格式正确,无需比较 rc 对两者 -1 0 请按以下步骤操作

       while(1)
       {
            //try to receive some data, this is a blocking call
            if ((rc = recvfrom(acceptSocket, buf, 256, 0, (struct sockaddr *) &client, &client)) == -1)   // read datagram from server socket
            {
                break;
            }
           //rest of your code
        }