1.服務器端代碼
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(void)
{
?int listenfd; //被動套接字(文件描述符),即只可以accept
?if((listenfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) ?{
? perror("socket");
? exit(EXIT_FAILURE);
?}
?struct sockaddr_in servaddr;
?memset(&servaddr, 0, sizeof(servaddr));
?servaddr.sin_family = AF_INET;
?servaddr.sin_port = htons(5188);
?servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
?if(bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) ?{
? ? ?perror("bind");
? ? ?exit(EXIT_FAILURE);
?}
?if(listen(listenfd, 500) ?{
? ? ?perror("listen");
? ? ?exit(EXIT_FAILURE);
?}
?struct sockaddr_in peeraddr; ?//
?socklen_t peerlen = sizeof(peeraddr); ?//
?int conn;
?if((conn = accept(listenfd, (struct sockaddr*)&peeraddr, &peerlen)) ?{
? ? ?perror("accept");
? ? ?exit(EXIT_FAILURE);
?}
?char recvbuf[1024];
?while(1)
?{
? memset(recvbuf, 0, sizeof(recvbuf));
? int ret = read(conn, recvbuf, sizeof(recvbuf)); ?//服務器讀取客戶端傳來的消息,保存到recvbuf
? fputs(recvbuf, stdout); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //服務器將從客戶端讀入的消息寫出到終端
? write(conn, recvbuf, ret); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //服務器將保存的從客戶端讀入的消息再次發送回客戶端
?}
?close(conn);
?close(listenfd);
?return 0;
}
2.客戶端代碼
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(void)
{
int sock;
if((sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) {
perror("socket");
exit(EXIT_FAILURE);
}
struct sockaddr_in servaddr;
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(5188);
servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
if(connect(sock, (struct sockaddr*)&servaddr, sizeof(servaddr)) {
perror("connect");
exit(EXIT_FAILURE);
}
char sendbuf[1024] = {0};
char recvbuf[1024] = {0};
while(fgets(sendbuf, sizeof(sendbuf), stdin) > 0)
{
write(sock, sendbuf, sizeof(sendbuf));//客戶端將輸入的內容,寫到socket傳輸給服務器端
read(sock, recvbuf, sizeof(recvbuf)); //客戶端將服務器的內容讀入到recvbuf
fputs(recvbuf, stdout); ? ? ? ? ? ? ? ? ? ? ? ? //客戶端將讀入到recvbuf的服務器的內容輸出到終端
memset(sendbuf, 0, sizeof(sendbuf));
memset(recvbuf, 0, sizeof(recvbuf));
}
close(sock);
return 0;
}
3.運行,開兩個終端,一個gcc server.c
運行
另一個gcc client.c
運行
然后在兩個終端輸入字符串即可
4.運行結果,服務器端輸入aabb,客戶端無反應,客戶端輸入aabb,客戶端和服務器端都會輸出aabb(客戶端再次輸出,同輸入的一樣)。愛掏網 - it200.com