通过网络在C中发送/接收数据

时间:2012-12-04 21:17:06

标签: c network-programming

我写了这个程序:

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

2 个答案:

答案 0 :(得分:5)

服务器就像交换机板上的电话运营商。那个人做了以下事情:

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

另一端的人只想打电话给那个人。 (即connect)。当需要打电话时,此人只需要打电话。因此没有绑定到手机或不得不听它响。

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

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

答案 1 :(得分:4)

序列如下:

服务器端:

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

客户端:

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

Here您可能会找到一些其他资源。