1

我写了这个程序:

#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);
}
4

2 回答 2

5

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

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

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

我希望这个比喻有助于你的理解。

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

于 2012-12-04T21:25:15.920 回答
4

顺序如下:

服务器端:

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

客户端:

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

在这里,您可以找到一些额外的资源。

于 2012-12-04T21:19:57.370 回答