2

我在套接字编程中遇到错误。执行时它将在 bind() 函数之后挂起。这是代码:

int socket_rcv,new_socket;
struct sockaddr_in add1, add2;
int test[100];
    buffer= test;

printf("\n Initializing Socket....");

socket_rcv = socket(AF_INET,SOCK_STREAM,0);
if(socket_rcv == -1)
{
    perror("Socket not created.Error:");
    return 1;
}

printf("\n Socket created");

add1.sin_family = AF_INET;
add1.sin_addr.s_addr = htonl(INADDR_ANY);
add1.sin_port = htons(port_num);


if((socket_rcv = bind(socket_rcv,(struct sockaddr*)&add1,sizeof(add1))) == -1)
{
    perror("binding failed. Error:");
    return 1;
}
printf("\n Bind completed");

if(listen(socket_rcv,10) == -1)
{
    perror("listen failed.Error:");
    return 1;
}

socklen_t sizes = sizeof(add2);

printf("\n Waiting for connection.....");

new_socket = accept(socket_rcv, (struct sockaddr*) &add2, &sizes);

if(new_socket != -1)
{
    printf("\n %d, Accepted",new_socket);

    if(recv(new_socket,(char*)buffer,100,1)<0)
    {
        printf("\n No data received from %d socket",new_socket);
        return 1;
        }
    printf("\n Data Received\n");
}
else
{
    perror("Accept failed. Error:");
    return 1;
}

close(new_socket);
close(socket_rcv);
return 0;

我的问题是在执行这段代码时,它会在 bind() 函数之后挂起。最后显示的那一行是“Bind Completed”,之后就会挂起。那么 bind() 函数有问题吗?

4

3 回答 3

2

在接受来自套接字的连接之前,您必须做三件事:

  1. socket使用该函数创建套接字。从评论中,您似乎正确地做到了这一点。
  2. 使用该函数将套接字绑定到一个地址bind。这告诉系统您正在接受连接的地址。从评论看来,您也正确地执行了此操作。
  3. listen使用该函数将套接字标记为“被动” 。这告诉系统套接字将用于接受传入的连接。

这是一个完整的程序,显示了接受连接的所有步骤。

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <stdio.h>

int main(void) {
    int server_fd;
    struct sockaddr_in server_addr;

    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    server_addr.sin_port = htons(8080);

    if ((server_fd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
        perror("socket");
        return 1;
    }

    if (bind(server_fd, (struct sockaddr*) &server_addr, sizeof(server_addr)) == -1) {
        perror("bind");
        return 1;
    }

    if (listen(server_fd, 10) == -1) {
        perror("listen");
        return 1;
    }

    struct sockaddr_in client_addr;
    socklen_t client_addrlen = sizeof(client_addr);

    int client_fd = accept(server_fd, (struct sockaddr*) &client_addr, &client_addrlen);
    if (client_fd == -1) {
        perror("accept");
        return 1;
    }

    puts("Connection accepted");

    close(client_fd);
    close(server_fd);
}
于 2013-09-19T07:32:46.447 回答
0

仅供参考,解决此问题的另一种方法可能是在 tcpclient 下运行您的 C 程序 - 即 tcpclient 将生成您的程序并打开与服务器的 tcp 连接,并将您的程序的标准输出通过管道传输到服务器,并从服务器传输输出到您程序的标准输入。这样做的好处是您可以让 tcpclient 承担所有繁重的工作,例如设置套接字等,并且您可以专注于程序的核心功能。有关详细信息,请参阅http://cr.yp.to/ucspi-tcp/tcpclient.html

于 2013-09-20T20:44:30.067 回答
0

所有我上传的工作代码,我得到的所有错误都解决了。

if((bind(socket_rcv,(struct sockaddr*)&add1,sizeof(add1))) == -1)
    {
        perror("binding failed. Error:");
        return 1;
    }
    printf("\n Bind completed");

谢谢大家

于 2013-09-20T07:14:38.370 回答