2012-12-04 33 views
1

接收通過網絡的數據我寫了這個程序:發送/用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; 
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

的順序如下:

服務器端:

  • 插座創作與socket系統調用;
  • 端口與bind系統調用的綁定;
  • 使用系統調用listen進行收聽(這將啓用積壓隊列);
  • 接受與accept系統調用
    • 傳入連接這是一個阻斷操作:你的線程將繼續阻塞,直到一連接進來);
    • accept函數將返回一個新的文件描述符表示新的連接。您將使用這一個與其他主機發送/接收數據,而原始的文件描述符(來自socket)將用於新的傳入連接。

客戶端:

  • 套接字創建與socket;
  • 連接connect

Here我有一段舊的代碼,這不是很好,但它顯示瞭如何做這個操作。

4

服務器就像交換臺上的電話運營商。那個人執行以下操作:

  • 坐在電話前(即bind多項)
  • 等待其環(即listen
  • 拿起電話(即accept

另一端的人只是想打電話給那個人。 (即connect)。需要打電話的人只需要打電話。因此,不要綁定到電話或必須聽它響。

我希望這個比喻有助於你的理解。

PS:socket部分是牆上的電話插座。

+0

+1爲真棒比喻 – Dacav