linux网络编程——初探TCP

服务器端等待客户端连接,连接成功后,打印客户端的IP和PORT,然后循环接收数据,缓冲区无数据就阻塞待待。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>

#define MAXBUF	10					// 缓冲区大小
#define DEFAULT_PORT	8888		// 默认端口
#define	DEFAULT_MSGNUM	1000		// 最大连接数量

int main(int argc,char *argv[])
{
	int ret;
	unsigned char buf[MAXBUF];
	int fd_socket, new_fd, len;
	struct sockaddr_in	AddrServer;
	struct sockaddr_in	AddrClient;
	bzero(&AddrServer,sizeof(AddrServer) );
	bzero(&AddrClient,sizeof(AddrClient) );
	
	signal(SIGCHLD,SIG_IGN);
	
	/* 1. 建立一个Socket */
	if( (fd_socket = socket(AF_INET, SOCK_STREAM,0) ) == -1)
	{
		perror("socket");
		exit(0);
	}
	
	/* 2. bind */
	AddrServer.sin_family	=	AF_INET;	/* IPV4 */
	if(argv[1])			/* 命令行输入了IP Addr  */
	{
		AddrServer.sin_addr.s_addr		= inet_addr( argv[1]);
	}
	else				/* 本机任IP */
	{
		AddrServer.sin_addr.s_addr		= INADDR_ANY;
	}
	
	if(argv[2])			/* 命令行输入了端口号 */
	{
		AddrServer.sin_port		= htons( atoi(argv[2]));
	}
	else				/* 采用默认端口 */
	{
		AddrServer.sin_port		= DEFAULT_PORT;
	}
	/* 3. bind */
	ret = bind(fd_socket, (struct sockaddr *)&AddrServer, sizeof(struct sockaddr) );
	if(ret == -1)
	{
		perror("bind");
		exit(0);
	}
	/* 4. listen */	
	if( listen(fd_socket,DEFAULT_MSGNUM) == -1 )
	{
		perror("listen");
		exit(0);
	}	
	printf(" Server Create Success,Server IP: %s::%d \n",inet_ntoa(AddrServer.sin_addr),ntohs(AddrServer.sin_port));
	printf(" Server wait for connect.......\n");
	/* 4. accept */
	len = sizeof(struct sockaddr);
	new_fd = accept(fd_socket, (struct sockaddr *)&AddrClient, &len);
	if( new_fd == -1 )
	{
		perror("accept");
		exit(0);
	}
	else	/* listen监听到有连接,accept返回描述符 */
	{
		printf("Server: got connection from: %s,port: %d,socket: %d\n",
				inet_ntoa(AddrClient.sin_addr),
				ntohs(AddrClient.sin_port),new_fd);
	}
	
	while(1)
	{
		bzero(buf,sizeof(buf)+1);
		len = recv(new_fd,buf,MAXBUF,0);// 阻塞等待接收数据
		if(len == 0)					// 0表示对方关闭了连结
		{
			close(new_fd);
			printf("The Client Quit Connection!\n");
			break;
		}
		else if(len < 0)				// 异常
		{
			close(new_fd);
			printf("recv failure ! errno code is: %d, errno message is '%s' \n",
														 errno,strerror(errno));
			break;
		}
		else							// 接收到数据
		{
			buf[len] = 0;
			printf("%s\n",buf);
		}
	}
	
	close(fd_socket);
	return 0;
}

客户端连接服务器,连接成功后循环接收缓冲区数据,有数据输入,则读取发送给服务器端。

#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <sys/types.h>         
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <errno.h>

#define BUFFER_SIZE 1024

int main(int argc,char *argv[])
{
	char buf[BUFFER_SIZE];
	int res;
	int fd_socket, len;
	struct sockaddr_in	AddrServer;					// 目标服务器IP地址
	if(argc != 3)
	{
		printf("Usage: %s <ip_addr> <port>\n",argv[0]);
		exit(0);
	}
	/* 1. 创建一个socket */
	fd_socket = socket(AF_INET, SOCK_STREAM, 0);
	if(fd_socket < 0)
	{
		perror("Socket");
		exit(errno);
	}	
	/* 2. connect */
	bzero(&AddrServer,sizeof(AddrServer));
	AddrServer.sin_family 			= AF_INET;			/* 地址协议 */
	AddrServer.sin_addr.s_addr		= inet_addr(argv[1]);
	AddrServer.sin_port				= htons( atoi(argv[2]) );	
	res = connect(fd_socket, (struct sockaddr *)&AddrServer, sizeof(AddrServer) );
	if(res == -1)
	{
		perror("Connect");
		exit(errno);
	}
	printf("Connect Server Success\n");	
	while(1)
	{
		printf("----#");
		fgets(buf,BUFFER_SIZE-1,stdin);		// 从终端读入数据
		if( strncasecmp(buf,"quit",4) == 0 )
		{
			printf(" quit......!\n");
			break;
		}
		len = send(fd_socket,buf,strlen(buf) - 1, 0);
		if(len < 0)
		{
			perror("Send");
			break;
		}
	}
	
	close(fd_socket);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值