2015-04-04 22 views
0

我在绑定套接字时遇到了问题。当我编译此代码:C TCP/IP回声服务器 - 绑定和接受函数时出错

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

int main(int argc, char *argv[]) 
{ 
    if (argc != 2) 
    { 
     printf("Error. Please enter the right amount of arguments (2)"); 
     exit(1); 
    } 

    int sock, port, clientlen, connection, readfd, writefd; 
    char buffer[255]; 
    struct sockaddr_in server, clientaddr; 

    if (sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) < 0) 
    { 
     printf("Socket was not made."); 
     exit(1); 
    } 

    bzero((char *) &server, sizeof(server)); 
    port = atoi(argv[1]); 

    server.sin_family = AF_INET; 
    server.sin_addr.s_addr = INADDR_ANY; 
    server.sin_port = htons(port); 

    if ((bind(socket, (struct sockaddr *) &server, sizeof(server))) < 0) 
    { 
     printf("Could not bind socket to address\n"); 
     exit(1); 
    } 

    listen(socket, 5); 

    clientlen = sizeof(clientaddr); 

    if (connection = accept(socket, (struct sockaddr *) &clientaddr, &clientlen) < 0) 
    { 
     printf("Could not accept connection"); 
     exit(1); 
    }  

    if (readfd = read(connection, buffer, 255) < 0) 
    { 
     printf("Could not read from socket"); 
     exit(1); 
    } 

    printf("!---THIS IS A TEST---! \n BUFFER: %s", buffer); 

    if (writefd = write(connection, buffer, 255) < 0) 
    { 
     printf("Could not write to socket"); 
     exit(1); 
    } 

    return 0; 
} 

我得到的错误:

a3server.c: In function ‘main’: 
a3server.c:33:28: warning: passing argument 1 of ‘bind’ makes integer from pointer without a cast [enabled by default] 
    if ((bind(socket, (struct sockaddr *) &server, sizeof(server))) < 0) 
         ^
In file included from a3server.c:2:0: 
/usr/include/x86_64-linux-gnu/sys/socket.h:123:12: note: expected ‘int’ but argument is of type ‘int (*)(int, int, int)’ 
extern int bind (int __fd, __CONST_SOCKADDR_ARG __addr, socklen_t __len) 
     ^
a3server.c:39:2: warning: passing argument 1 of ‘listen’ makes integer from pointer without a cast [enabled by default] 
    listen(socket, 5); 
^
In file included from a3server.c:2:0: 
/usr/include/x86_64-linux-gnu/sys/socket.h:233:12: note: expected ‘int’ but argument is of type ‘int (*)(int, int, int)’ 
extern int listen (int __fd, int __n) __THROW; 
     ^
a3server.c:43:42: warning: passing argument 1 of ‘accept’ makes integer from pointer without a cast [enabled by default] 
    if (connection = accept(socket, (struct sockaddr *) &clientaddr, &clientlen) < 0) 
            ^
In file included from a3server.c:2:0: 
/usr/include/x86_64-linux-gnu/sys/socket.h:243:12: note: expected ‘int’ but argument is of type ‘int (*)(int, int, int)’ 
extern int accept (int __fd, __SOCKADDR_ARG __addr, 

我这里按照本指南:http://www.cs.rpi.edu/~moorthy/Courses/os98/Pgms/socket.html,我不太肯定我出了问题。

此外,这是我编译“gcc a3server.c -g -o服务器”时的命令,如果这与它有任何关系。

回答

1

您在bind(),listen()和accept()中使用的'socket'变量未定义。由socket()返回的文件描述符被保存在'sock'变量中。你必须用'袜子'代替'插座'的发生。

正确的方式做,这将是:

bind (sock, (struct sockaddr *) &server, sizeof (server)) 
... 
listen (sock, 5); 
... 
accept (sock, ... 
+0

男孩是令人尴尬......我固定的,现在我在编译过程中没有错误,但我仍然无法将地址绑定。 – 2015-04-04 17:56:38

+0

使用** errno **来确定为什么bind()不起作用 – 2015-04-04 18:04:40

+0

它给了我“在非套接字上进行套接字操作” – 2015-04-04 18:19:48