C在Socket上编程的Windows错误听,但没有errno

问题描述:

我已经完成了其他语言的套接字编程,但从来没有处理直接在C中进行处理。我试图设置一个简单的服务器来侦听Windows下的端口8080。我使用mingw附带的gcc编译代码。C在Socket上编程的Windows错误听,但没有errno

 


    #include <stdio.h> 
    #include <string.h> 
    #include <WinSock2.h> 
    #include <stdint.h> 
    #include <time.h> 

     int main(void) { 

     int s;  
     int len; 
     char buffer[1025]; 
     struct sockaddr_in servAddr; 
     struct sockaddr_in clntAddr; 

     int clntAddrLen; //length of client socket addre 

    //Build local (server) socket add 

     memset(&servAddr, 0, sizeof(servAddr)); 
     servAddr.sin_family = AF_INET; 
     servAddr.sin_port = htons(8080); 
     servAddr.sin_addr.s_addr = htonl(INADDR_ANY); 

     //create socket 
     if((s=socket(AF_INET, SOCK_STREAM, 0) %lt; 0)){ 
      perror("Error: Socket Failed!"); 
       printf("%d\n", errno); 
      exit(1); 
     } 

    //bind socket to local address and port 
     if((bind(s,(struct sockaddr*)&servAddr, sizeof(servAddr)) %lt; 0)) 
     { 
      perror("Error:bind failed!"); 
       printf("%d\n", errno); 
      exit(1); 
     } 

     for(;;) 
     { 
      len = recvfrom(s,buffer, sizeof(buffer),0,(struct sockaddr*)&clntAddr, &clntAddrLen); 

      //send string 
      sendto(s, buffer, len, 0, (struct sockaddr*)&clntAddr, sizeof(clntAddr)); 
     } 

    } 

 

当我运行代码时,它出错了绑定,但没有错误。此代码是从这个线程采取并稍作修改:Windows Socket Programming in C

但没有错误代码。输出打印出没有错误。它在绑定失败,我不知道为什么。我一直在拼凑一些不同的来源。我简直就是想在Windows上用C语言做一个hello world/3 way握手。

在此先感谢。

这是不正确由于operator precedence

if((s=socket(AF_INET, SOCK_STREAM, 0) < 0)){ 

<=更高的优先级。这意味着代码将根据socket(AF_INET, SOCK_STREAM, 0) < 0的结果分配10s。 更改为:

if((s=socket(AF_INET, SOCK_STREAM, 0)) < 0){ 

使用WSAGetLastError()获得失败的原因,而不是errno。来自MSDN bind()参考页:

如果没有错误发生,则bind返回零。否则,它将返回SOCKET_ERROR,,通过调用WSAGetLastError可以检索特定的错误代码。

在Windows上调用WSAStartup()之前,必须调用任何套接字函数。

+0

另外,'WSACleanup()'应该在使用套接字完成时运行。 – ehudt 2013-04-03 20:28:55