TCP/IP socket通信简单案例

本文提供了一个使用C++进行网络编程的详细示例,包括服务器端和客户端代码。通过socket编程实现TCP连接,演示了如何创建服务器监听特定端口,接收并处理来自客户端的数据,同时客户端能够连接到服务器并发送消息。

server.cpp

#include <iostream>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
using namespace std;

#define LISTEN_PORT 8888
#define BACKLOG     10
/*
socket:  int socket(int domain, int type, int protocol);
bind  :  int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
listen:  int listen(int sockfd, int backlog);
accept:  int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
send  :  ssize_t send(int sockfd, const void *buf, size_t len, int flags);
recv  :  ssize_t recv(int sockfd, void *buf, size_t len, int flags);
*/

int main(int argc,char* argv[])
{
	int Server_fd;
	int Client_fd;
	int ret;
	int Addrlen;
	unsigned char RecBuff[1000];
	int RevData_len;
	int clientnum = -1;
	struct sockaddr_in Server_sockaddr_in;
	struct sockaddr_in Client_sockaddr_in;
	Server_sockaddr_in.sin_family = AF_INET;
	Server_sockaddr_in.sin_port = htons(LISTEN_PORT); //host to net
	Server_sockaddr_in.sin_addr.s_addr = INADDR_ANY;
	memset(Server_sockaddr_in.sin_zero,0,8);
	Server_fd = socket(AF_INET, SOCK_STREAM, 0);
	if (-1 == Server_fd)
	{
		cout << "Create the server socket failed!\n";
		return -1;
	}
	ret = bind(Server_fd, (const struct sockaddr*)&Server_sockaddr_in,sizeof(struct sockaddr_in));
	if (-1 == ret)
	{
		cout << "bind error !\n";
		return -1 ;
	}
	ret = listen(Server_fd, BACKLOG);
	if (-1 == ret)
	{
		cout << "listen error !\n";
		return -1 ;
	}
	while(1)
	{
		Addrlen = sizeof(sockaddr_in);
		Client_fd = accept(Server_fd, (struct sockaddr *)&Client_sockaddr_in,(socklen_t*)&Addrlen);
		clientnum++;
		if(-1 != Client_fd)
		{
			cout <<"get a connect successfully!\n";
			cout <<"The client nummber is: "<<clientnum;
			cout <<"; client IP  is :" << inet_ntoa(Client_sockaddr_in.sin_addr);
			cout <<endl;
		}
		if(0 == fork())
		{	
			while(1)
			{
				RevData_len = recv(Client_fd,RecBuff,999,0);
				if(0 >= RevData_len)
				{
					cout << "Receive data failed !\n";
					close(Client_fd);
					return -1;
				}
				else 
				{
					cout << "Receive data from client " << clientnum ;
					cout << "  IP :" << inet_ntoa(Client_sockaddr_in.sin_addr)<<"successfully\n";
					cout << "The meseage is :"<<RecBuff <<endl;
				}
			}
		}
	}
	close(Server_fd);
	close(Client_fd);
	return 0;
}

client.cpp

#include <iostream>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdio.h>
using namespace std;

#define LISTEN_PORT 8888
/*
socket:  int socket(int domain, int type, int protocol);
bind  :  int bind(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
listen:  int listen(int sockfd, int backlog);
send  :  ssize_t send(int sockfd, const void *buf, size_t len, int flags);
recv  :  ssize_t recv(int sockfd, void *buf, size_t len, int flags);
coonnect :int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);
*/
int main(int argc,char* argv[])
{
	if(argc != 2)
	{
		cout << "Usage : " << argv[0] << "Server IP \n";
		return -1;
	}
	int Client_fd;
	int ret;
	int Addrlen;
	char SendBuff[1000];
	
	struct sockaddr_in Server_sockaddr_in;
	struct sockaddr_in Client_sockaddr_in;
	Server_sockaddr_in.sin_family = AF_INET;
	Server_sockaddr_in.sin_port = htons(LISTEN_PORT); //host to net
	memset(Server_sockaddr_in.sin_zero,0,8);
	ret = inet_aton(argv[1],&Server_sockaddr_in.sin_addr);
	if (0 == ret)
	{
		cout << "Invalid server IP\n";
		return -1 ;
	}
	Client_fd = socket(AF_INET, SOCK_STREAM, 0);
	if (-1 == Client_fd)
	{
		cout << "Create the client socket failed!\n";
		return -1;
	}
	ret = connect(Client_fd, (const struct sockaddr *)&Server_sockaddr_in,sizeof(struct sockaddr_in));
	if(-1 == ret)
	{
		cout << "Connect to server failed!\n";
		close(Client_fd);
		return -1;
	}
	while(1)
	{
		cout << "Please input :";
		fgets(SendBuff,999,stdin);
		send(Client_fd,SendBuff,strlen(SendBuff),0);
		
	}
	return 0;
}

 运行结果:

(有空再补充注释分析) 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值