【问题标题】:Send / receive data over network in C在 C 中通过网络发送/接收数据
【发布时间】:2018-06-15 19:38:56
【问题描述】:

我写了这个程序:

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

int socket_desc;
struct sockaddr_in adress;
int addrlen;
int new_socket;
int bufsize = 1024;

char *you_sent = "You sent: ";

int main() {
    char *buffer = malloc(bufsize);
    socket_desc = socket(AF_INET, SOCK_STREAM, 0);
    adress.sin_family = AF_INET;
    adress.sin_addr.s_addr = INADDR_ANY;
    adress.sin_port = htons(7000);
    bind(socket_desc, (struct sockaddr *)&adress, sizeof(adress));
    listen(socket_desc, 3);
    addrlen = sizeof(struct sockaddr_in);
    new_socket = accept(socket_desc, (struct sockaddr *)&adress, &addrlen);
    while(recv(new_socket,buffer,bufsize,0))
    {
        printf("I recieved: %s", buffer);
        send(new_socket, you_sent, strlen(you_sent), 0);
        send(new_socket, buffer, strlen(buffer), 0);
        memset(buffer, '\0', sizeof(buffer));
    }
}

我可以通过 telnet 连接到服务器。并将内容写入应用程序并从应用程序接收数据。 但是我无法理解如何使用另一个 c 程序连接到它并从该程序发送和接收数据。 我试过这个:

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

int socket_desc;
struct sockaddr_in adress;
int addrlen;
int new_socket;

char *message_to_send = "Hello world!";

int main() {
    socket_desc = socket(AF_INET, SOCK_STREAM, 0);
    adress.sin_family = AF_INET;
    adress.sin_addr.s_addr = INADDR_ANY;
    adress.sin_port = htons(7000);
    bind(socket_desc, (struct sockaddr *)&adress, sizeof(adress));
    listen(socket_desc, 3);
    addrlen = sizeof(struct sockaddr_in);
    new_socket = accept(socket_desc, (struct sockaddr *)&adress, &addrlen);
    send(new_socket, message_to_send, strlen(message_to_send), 0);
}

【问题讨论】:

    标签: c network-programming


    【解决方案1】:

    服务器就像交换机上的电话接线员。该人执行以下操作:

    • 坐在电话前(即bind 对一个号码)
    • 等待它响铃(即listen
    • 拿起电话(即accept

    另一端的人只是想给那个人打电话。 (即connect)。该人仅在需要拨打电话时才需要接听电话。因此不必绑定到电话或必须听它响铃。

    我希望这个比喻能帮助你理解。

    PS:socket 部分是墙上的电话插座。

    【讨论】:

      【解决方案2】:

      顺序如下:

      服务器端:

      • 使用socket 系统调用创建套接字;
      • 将端口与bind 系统调用绑定;
      • 使用listen 系统调用监听(这将启用积压队列);
      • 使用accept 系统调用接受传入连接
        • 这是一个阻塞操作:你的线程将保持阻塞状态直到连接进来);
        • accept 函数将返回一个表示新连接的新文件描述符。您将使用它与另一台主机发送/接收数据,而原始文件描述符(来自socket)将用于新的传入连接。

      客户端:

      • 使用socket 创建套接字;
      • connect的连接。

      Here你可能会发现一些额外的资源。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-04-06
        • 1970-01-01
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多