gpt4 book ai didi

c - Linux 中的套接字编程

转载 作者:太空狗 更新时间:2023-10-29 12:18:15 26 4
gpt4 key购买 nike

我在套接字编程中遇到错误。执行时,它会在 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() 函数有问题吗?

最佳答案

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

  1. 使用socket 函数创建套接字。从评论来看,您似乎做得对。
  2. 使用bind 函数将套接字绑定(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);
}

关于c - Linux 中的套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18886470/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com