c 中的 TCP 套接字 [英] TCP sockets in c

查看:32
本文介绍了c 中的 TCP 套接字的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试为我的程序编写一个 TCP 套接字接口,但我正在接受一个 accept() 错误(我认为).为此,我创建了一些简化的测试代码.
首先我做了一些设置

I'm attempting to write a TCP socket interface for my program and I'm pulling my hair out with an accept() error (I think). For this I've created some boiled down test code.
First I do a little set up

int server_socket = 0;
server_socket = socket(AF_INET, SOCK_STREAM, 0);

int accepted_connection = 0;

struct sockaddr_in server_address;
server_address.sin_port = htons(9001);
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = INADDR_ANY;

struct sockaddr_in client_address;
client_address.sin_port = 0;
client_address.sin_family = AF_INET;

char * server_socket_read_buffer[100] = {0};
int server_socket_read_length = 0;

所有非常简单的东西.只需分配一些变量.接下来我绑定听

All pretty simple stuff. Just allocate some variables. Next I bind and listen

if (bind(server_socket,(struct sockaddr *)&server_address, sizeof(server_address)) < 0)
{
    perror("Bind() on server_socket has failed\n");
}

if (listen(server_socket, 10) < 0)
{
    perror("Listen() on server_socket has failed\n");
}

接下来是我认为我有问题的部分

Next is the part where I believe I have my problem

printf("Attempting accept!\n");
if (accepted_connection = accept(server_socket, (struct sockaddr *)NULL, NULL) < 0)
{
    perror("Accept failed\n");
}
sleep(10);
if (server_socket_read_length = read(accepted_connection, &server_socket_read_buffer, server_socket_read_length) < 0)
{
    perror("Read failed\n");
}
printf("Read %d bytes from socket\n", server_socket_read_length);
for (int i = 0; i<server_socket_read_length;i++)
{
    printf("%x\n",server_socket_read_buffer[i]);
}

这将编译并运行.当我将 nc 与命令 'nc 127.0.0.1 9001' 一起使用时,我获得了一个连接,但没有读取任何数据.特别是我得到 0 字节的数据.我认为这可能是由于接受行中的 NULL,但将它们更改为正确的结构和长度会阻止我的代码编译.

This compiles and runs. When I use nc with the command 'nc 127.0.0.1 9001' I get a connection, but no data is read. In particular I get 0 bytes of data. I thought this might be due to the NULLs in the accept line, but changing those to a proper struct and length prevent my code from compiling.

如果有人能说明我做错了什么,我将不胜感激.

If anyone can shed some light on what I'm doing wrong I would be very grateful.

推荐答案

有几个错误:

  1. INADDR_ANY 是主机字节序,需要像 htonl(INADDR_ANY) 一样转换为网络一.但没关系,因为常量 INADDR_ANY 被定义为 0.

  1. INADDR_ANY is in host byte order and needs to be converted to network one like htonl(INADDR_ANY). But it does not matter since constant INADDR_ANY is defined as 0.

这个

char * server_socket_read_buffer[100]

应该是

char server_socket_read_buffer[100]

  • 这个

  • This

    read(accepted_connection, &server_socket_read_buffer, server_socket_read_length)
    

    应该是

    read(accepted_connection, server_socket_read_buffer, sizeof server_socket_read_buffer)
    

  • 这篇关于c 中的 TCP 套接字的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆