c - Linux C套接字

标签 c linux sockets protocols

晚上好,我是在c编程语言下使用linux sockets的新手。

现在我正在尝试让客户端与服务器进行通信。基本上我坚持的事情是让服务器接受来自客户端的连接并在收到数字后打印出来。这是到目前为止服务器的源代码:

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <time.h>

int main(int argc, char *argv[])
{
    int listenfd = 0, connfd = 0, n = 0;
    struct sockaddr_in serv_addr;
    char sendBuff[1024], recvBuff[1024];

    listenfd = socket(AF_INET, SOCK_STREAM, 0);
    memset(&serv_addr, '0', sizeof(serv_addr));
    memset(sendBuff, '0', sizeof(sendBuff));

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(5000);

    bind(listenfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr));

    listen(listenfd, 10);

    while(1)
    {
        printf("in first while loop\n");
        connfd = accept(listenfd, (struct sockaddr*)NULL, NULL);
        while( (n = read(listenfd, recvBuff, sizeof(recvBuff)-1)) > 0)
        {
                printf("in second while loop\n");
                recvBuff[n] = 0;

                fputs(recvBuff, stdout);
        }
    }
}

我没有发布客户端代码,因为我认为它不相关。 我做了一个服务器,它向客户端发送一些东西,它工作得很好。但我对如何让服务器接受来自客户端的输入感到非常困惑。先感谢您。

最佳答案

给出的其他答案(从 connfd 而不是 listenfd 读取)将解决您代码中的问题;提出这个答案可能有助于解决围绕服务器套接字的“严重困惑”。

“套接字”通常被认为是两个应用程序之间的管道,这就是接受和连接套接字在我们的代码中的行为方式(connfd 在您的上面的例子)。

但是,一般来说,“套接字”只是一个“句柄”,也可以以其他方式使用,例如希望通过绑定(bind)到特定端口来接受新连接的服务器。在上面的示例中,listenfd 是一个套接字句柄,用于绑定(bind)到特定端口,因此可以接受连接。 accept 的每次成功返回实际上返回一个 套接字句柄到已连接的套接字(例如connfd),实际上可以从中读取数据并写信给。

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

相关文章:

c - 从 C 中的 DLL 函数返回 char 缓冲区而不产生内存泄漏

cublasDGemm 奇怪的结果

linux - 无法将文件和目录添加到 PATH

android - 无法关闭 InputStreamReader

python - 是否可以通过 Python 的 Socket 模块发送文件和/或文件夹?

c - 在 C 中打印出所有时区

C - 跨多个文件返回结构指针时出错

java - 打开 Eclipse 时无法加载 JavaHL 库

linux - Linux Expect 脚本如何工作?

java - 一起使用 BufferedWriter 和 BufferedOutputStream 是不是太过分了?