下面設計一個簡單的CS例子:服務端監聽某個端口,接受一個連接,接收該連接傳來的數據並顯示;客戶端連接服務端,把標準輸入的信息發給服務端。
服務端代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
// 創建TCP套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == sock)
{
perror("socket");
return -1;
}
// 填充地址結構體:監聽8888端口
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY; // 任意接口地址
addr.sin_port = htons(8888); // 8888端口,htons從主機序到網絡序
// 綁定地址
int ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr));
if (-1 == ret)
{
perror("bind");
return -1;
}
// 開始監聽
ret = listen(sock, 10);
if (-1 == ret)
{
perror("listen");
return -1;
}
// 接受新連接
int len = sizeof(addr);
int conn = accept(sock, (struct sockaddr *)&addr, &len);
if (-1 == conn)
{
perror("accept");
return -1;
}
// 新連接対端信息
printf("accept %s:%d\n\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
while (1)
{
// 接收信息
char buffer[1024];
len = recv(conn, buffer, sizeof(buffer)-1, 0);
if (-1 == len)
{
perror("recv");
return -1;
}
else if (0 == len) // 連接斷開
{
break;
}
buffer[len] = '\0';
printf("%s", buffer);
}
return 0;
}
客戶端代碼:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[])
{
// 創建TCP套接字
int conn = socket(AF_INET, SOCK_STREAM, 0);
if (-1 == conn)
{
perror("socket");
return -1;
}
// 填充地址結構體:連接本機的8888端口
struct sockaddr_in addr;
bzero(&addr, sizeof(addr));
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(8888);
// 連接到服務端:本機的8888端口
int ret = connect(conn, (struct sockaddr *)&addr, sizeof(addr));
if (-1 == ret)
{
perror("connect");
return -1;
}
while (1)
{
// 從標準輸入讀入
char buffer[1024];
int len = read(0, buffer, sizeof(buffer));
if (-1 == len)
{
perror("read");
return -1;
}
else if (0 == len)
{
break; // 輸入結束
}
// 將輸入信息發給服務端
len = send(conn, buffer, len, 0);
if (-1 == len)
{
perror("send");
return -1;
}
}
return 0;
}
當然了,這兩個程序還是相當醜陋的,網絡編程要注意很多細節。儘管如此,對於網絡編程初學者弄懂socket編程流程還是有幫助的。