linux c語言socket編程實例

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章