TCP socket 编程示例

本代码为老师提供的示例程序

一、TCP socket 编程模型
在这里插入图片描述
二、使用TCP协议实现一个简单的通讯程序
1.服务器端

#include<stdlib.h>
#include<stdio.h>
#include<sys/socket.h>
#include<netdb.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
 
#define PORT 8900
 
int main(int argc,char** argv)
{
	struct sockaddr_in server;
	struct sockaddr_in client;
	int len;
	int port;
	int listend;
	int connectd;
	int sendnum;
	int opt;
	int recvnum;
	char send_buf[2048];
	char recv_buf[2048];
 
 
	port= PORT;
	memset(send_buf,0,2048);
	memset(recv_buf,0,2048);
	
    opt = SO_REUSEADDR;
      
 
    if (-1==(listend=socket(AF_INET,SOCK_STREAM,0)))
    {
	 perror("create listen socket error\n");
	 exit(1);
    }
    setsockopt(listend,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));
 
 
    memset(&server,0,sizeof(struct sockaddr_in));
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = htonl(INADDR_ANY);
    server.sin_port = htons(port);
 
    if (-1==bind(listend,(struct sockaddr *)&server,sizeof(struct sockaddr)))
    {
	perror("bind error\n");
	exit(1);
    }
 
    if (-1==listen(listend,5))
    {
	perror("listen error\n");
	exit(1);
    }
 
    while (1)
    {
        if (-1==(connectd=accept(listend,(struct sockaddr*)&client,&len)))
    	{
		perror("create connect socket error\n");
		continue;
    	}
 
	
	sendnum = sprintf(send_buf,"hello,the guest from %s\n",inet_ntoa(client.sin_addr));
    if ( 0 >send(connectd,send_buf,sendnum,0))
	{
		perror("send error\n");
		close(connectd);
		continue;
	}
	
 
    if (0>(recvnum = recv(connectd,recv_buf,sizeof(recv_buf),0)))
	{
		perror("recv error\n");
		close(connectd);
		continue;
	}
	recv_buf[recvnum]='\0';
 
	printf ("the message from the client is: %s\n",recv_buf);
 
	if (0==strcmp(recv_buf,"quit"))
        {
		perror("the client break the server process\n");
		close(connectd);
		break;
	}
 
	sendnum = sprintf(send_buf,"%s\n",recv_buf);
  
    send(connectd,send_buf,sendnum,0);
  
	close(connectd);
	continue;
   }
    close(listend);
    return 0;
}

2.客户端

#include<stdlib.h>
#include<stdio.h>
#include<sys/socket.h>
#include<netdb.h>
#include<string.h>
#include<unistd.h>
#include<netinet/in.h>
#include<arpa/inet.h>
 
#define PORT 8900
 
void print_usage(char * cmd)
{
	fprintf(stderr," %s usage:\n",cmd);
	fprintf(stderr,"%s IP_Addr [port]\n",cmd);
 
}
 
 
int main(int argc,char** argv)
{
	struct sockaddr_in server;
	int ret;
	int len;
	int port;
	int sockfd;
	int sendnum;
	int recvnum;
	char send_buf[2048];
	char recv_buf[2048];
 
	if ((2>argc)|| (argc >3))
	{
		print_usage(argv[0]);
		exit(1);
 
	}
 
    if (3==argc) 
    {
		port = atoi(argv[2]);
    }
 
    if (-1==(sockfd=socket(AF_INET,SOCK_STREAM,0)))
	{
		perror("can not create socket\n");
		exit(1);
	}
 
	memset(&server,0,sizeof(struct sockaddr_in));
	server.sin_family = AF_INET;
	server.sin_addr.s_addr = inet_addr(argv[1]);
	server.sin_port = htons(port);
 
	if (0>(ret=connect(sockfd,(struct sockaddr*)&server,sizeof(struct sockaddr))))
	{
		perror("connect error");
		close(sockfd);
		exit(1);
 
	}
 
	printf("what words do  you want to tell to server:\n");
	fgets(send_buf,2048,stdin);
 
	if (0>(len=send(sockfd,send_buf,strlen(send_buf),0)))
	{
		perror("send data error\n");
		close(sockfd);
		exit(1);
 
	}
 
	if (0>(len=recv(sockfd,recv_buf,2048,0)))
	{
		perror("recv data error\n");
		close(sockfd);
		exit(1);
	}
	
	recv_buf[len]='\0';
 
	printf("the message from the server is:%s\n",recv_buf);
	close(sockfd);
 
}

三、运行结果
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值