1.服務器端代碼:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <errno.h>
#define SERVER_PORT 10004
using namespace std;
#define MAXLINE 1024
int main() {
int listenfd, connfd;
struct sockaddr_in sockaddr;
struct sockaddr_in clientaddr;
int addr_len = sizeof(clientaddr);
char buff[MAXLINE];
int n;
memset(&sockaddr, 0, sizeof(sockaddr));
sockaddr.sin_family = AF_INET;
sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);
sockaddr.sin_port = htons(SERVER_PORT);
listenfd = socket(AF_INET, SOCK_STREAM, 0);
bind(listenfd, (struct sockaddr *)&sockaddr, sizeof(sockaddr));
listen(listenfd, 10);
// printf("Wait for the client information\n");
// printf("監聽端口:%d\n", SERVER_PORT);
while(1){
printf("監聽端口:%d\n", SERVER_PORT);
// clientAddr是一個傳出參數,accept返回時,傳出客戶端的地址和端口號
// addr_len是一個傳入-傳出參數,傳入的是調用者提供的緩衝區的clientAddr的長度,以免緩衝區溢出
// 傳出的是一個客戶端地址結構體的實際長度
if((connfd = accept(listenfd, (struct sockaddr*)&clientaddr, (socklen_t*)&addr_len)) == -1){
printf("accpect socket error: %s errno :%d \n", strerror(errno), errno);
}
printf("等待消息...\n");
printf("IP is %s\n", inet_ntoa(clientaddr.sin_addr));
printf("Port is %d\n", htons(clientaddr.sin_port));
while(1){
printf("讀取消息:");
n = recv(connfd, buff, MAXLINE, 0);
buff[n] = '\0';
printf("recv msg from client: %s\n", buff);
if(strcmp(buff, "quit") == 0){
break;
}
printf("發送消息:\n");
char resp[MAXLINE] = "return from server";
if((send(connfd, resp, strlen(resp), 0)) < 0){
printf("send mes error: %s errno : %d",strerror(errno), errno);
exit(0);
}
if(strcmp(resp, "quit") == 0){
break;
}
}
}
close(listenfd);
return 0;
}
2.客戶端:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>
#include <unistd.h>
using namespace std;
#define MAXLINE 1024
#define SERVER_PORT 10004
int main() {
//socket client init
char addr[] = "127.0.0.1";
char* servInetAddr = addr;
// char* servInetAddr = "127.0.0.1";
int socketfd;
struct sockaddr_in sockaddr;
char recvline[MAXLINE], sendline[MAXLINE];
//原型 int socket(int domain, int type, int protocol)
//domain表示要使用的協議簇,AF_UNIX(本機通信)AF_INET(TCP/IP - IPv4) AF_INET(IPv6)
//type參數指的是套接字類型 :SOCK_STREAM(TCP流) SOCK_DGRAM(UDP數據報) SOCK_RAW(原始套接字)
//如果前兩個參數確定了那麼protocol參數設置爲0
//如果創建成功則返回套接字,失敗則返回-1,並且錯誤代碼寫入errno
socketfd = socket(AF_INET, SOCK_STREAM, 0);
memset(&sockaddr, 0, sizeof(sockaddr)); //memset from string.h
sockaddr.sin_family = AF_INET; //sin_family from netinet/in.h
sockaddr.sin_port = htons(10004);
inet_pton(AF_INET, servInetAddr, &sockaddr.sin_addr); // inet_pton from arpa/inet.h
if((connect(socketfd, (struct sockaddr*) &sockaddr, sizeof(sockaddr)))<0){ //連接到服務器
printf("connect error %s errno: %d\n", strerror(errno),errno);
exit(0);
}
printf("連接到服務器...\n");
//end socket client init
while(1){
printf("發送消息...\n");
scanf("%s", sendline);
// strcpy(sendline, "hello");
if((send(socketfd, sendline, strlen(sendline), 0))<0){
printf("send message error: %s errno : %d", strerror(errno), errno);
exit(0);
}else{
printf("send message to server successful\n");
}
if(strcmp(sendline, "quit")==0){
break;
}
int bytesReceived = 0;
bytesReceived = recv(socketfd, recvline, MAXLINE, 0);
string RespStr = recvline;
RespStr = RespStr.substr(0,bytesReceived);
cout<<"recv msg from server:"+RespStr<<endl;
}
close(socketfd);
return 0;
}
參考教程:https://blog.csdn.net/jinmie0193/article/details/78951055