初识TCP/IP网络编程

本文提供了一组示例代码,展示了如何在Linux和Windows操作系统下使用TCP/IP进行简单的客户端-服务端通信。客户端连接到指定IP和端口,从服务端接收消息并打印。服务端监听特定端口,接收到连接请求后发送预设消息。程序的核心函数包括socket(),bind(),listen(),accept(),connect()以及相应的错误处理函数。
摘要由CSDN通过智能技术生成

 学习自《TCP/IP网络编程》

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char * message);

int main(int argc,char *argv[])
{
	int sock;
	struct sockaddr_in serv_addr;
	char message[30];
	int str_len;
	if(argc!=3)
	{
		printf("Usage : %s <IP> <port>\n",argv[0]);
		exit(1);
	}

	sock=socket(PF_INET,SOCK_STREAM,0);
	if(sock == -1)
		error_handling("socket() error");
	memset(&serv_addr,0,sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
	serv_addr.sin_port=htons(atoi(argv[2]));

	if(connect(sock,(struct sockaddr *)&serv_addr,sizeof(serv_addr))==-1)
		error_handling("connect() error!");
	str_len=read(sock,message,sizeof(message)-1);
	if(str_len==1)
		error_handling("read() error!");
	printf("Message from server : %s \n",message);
	close(sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}

服务端:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
void error_handling(char * message);

int main(int argc,char *argv[])
{
	int serv_sock;
	int clnt_sock;

	struct sockaddr_in serv_addr;
	struct sockaddr_in clnt_addr;
	socklen_t clnt_addr_size;

	char message[]="hello world!";

	if(argc!=2)
	{
		printf("Usage: %s <port>\n",argv[0]);
		exit(1);
	}

	serv_sock=socket(PF_INET,SOCK_STREAM,0);
	if(serv_sock == -1)
		error_handling("socker() error");

	memset(&serv_addr,0,sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
	serv_addr.sin_port=htons(atoi(argv[1]));

	if(bind(serv_sock,(struct sockaddr*)&serv_addr,sizeof(serv_addr))==-1)
		error_handling("bind() error");
	if(listen(serv_sock,5)==-1)
		error_handling("listen() error");
	clnt_addr_size=sizeof(clnt_addr);
	clnt_sock=accept(serv_sock,(struct sockaddr*)&clnt_addr,&clnt_addr_size);
	if(clnt_sock==-1)
		error_handling("accept() error");
	write(clnt_sock,message,sizeof(message));
	close(clnt_sock);
	close(serv_sock);
	return 0;
}

void error_handling(char *message)
{
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}

程序在Linux下运行,先启动服务端,再启动客户端

客户端会收到消息:Message from server : hello world!

#include <sys/socket.h>

int socket(int domain,int type,int protocol);

成功时返回文件描述符,失败时返回-1。

#include <sys/socket.h>

int bind(int sockfd,struct sockaddr *myaddr,socklen_t addrlen);

int listen(int sockfd,int backlog); 

int accept(int sockfd,struct sockaddr *addr,socklen_t * addrlen);

int connect(int sockfd,struct sockaddr * serv_addr,socklen_t addrlen); 

下面是在Windows下对应的程序:

客户端:

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>
void error_handling(char * message);

int main(int argc,char *argv[])
{
	
	WSADATA wsaData;
	SOCKET sock;
	SOCKADDR_IN serv_addr;
	
	char message[30];
	int str_len;
	if(argc!=3)
	{
		printf("Usage : %s <IP> <port>\n",argv[0]);
		exit(1);
	}

	if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
		error_handling("WSAStartup() error!");
	
	sock=socket(PF_INET,SOCK_STREAM,0);
	if(sock == INVALID_SOCKET)
		error_handling("socket() error");
	memset(&serv_addr,0,sizeof(serv_addr));
	serv_addr.sin_family=AF_INET;
	serv_addr.sin_addr.s_addr=inet_addr(argv[1]);
	serv_addr.sin_port=htons(atoi(argv[2]));

	if(connect(sock,(SOCKADDR *)&serv_addr,sizeof(serv_addr))==SOCKET_ERROR)
		error_handling("connect() error!");
	str_len=recv(sock,message,sizeof(message)-1,0);
	if(str_len==1)
		error_handling("read() error!");
	printf("Message from server : %s \n",message);
	closesocket(sock);
	WSACleanup();
	return 0;
}

void error_handling(char *message)
{
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}

 服务器:

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>


void error_handling(char * message);

int main(int argc,char *argv[])
{
	WSADATA wsaData;
	SOCKET hServSock,hClntSock;
	SOCKADDR_IN servAddr,clntAddr;
	
	int szClntAddr;
	char message[]="Hello World";
	if(argc!=2)
	{
		printf("Usage : %s <IP> <port>\n",argv[0]);
		exit(1);		
	}
	if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
		error_handling((char*)"WSAStartup() error!");
	
	hServSock=socket(PF_INET,SOCK_STREAM,0);
	if(hServSock == INVALID_SOCKET)
		error_handling((char*)"socket() error");
	memset(&servAddr,0,sizeof(servAddr));
	servAddr.sin_family=AF_INET;
	servAddr.sin_addr.s_addr=htonl(INADDR_ANY);
	servAddr.sin_port=htons(atoi(argv[1]));

	if(bind(hServSock,(SOCKADDR *)&servAddr,sizeof(servAddr))==SOCKET_ERROR)
		error_handling((char*)"bind() error");
	if(listen(hServSock,5)==SOCKET_ERROR)
		error_handling((char*)"listen() error");
		
	szClntAddr=sizeof(clntAddr);
	hClntSock=accept(hServSock,(SOCKADDR*)&clntAddr,&szClntAddr);
	if(hClntSock==INVALID_SOCKET)
		error_handling((char*)"accept() error");
	send(hClntSock,message,sizeof(message),0);
	closesocket(hClntSock);
	closesocket(hServSock);
	WSACleanup();
	return 0;
}

void error_handling(char *message)
{
	fputs(message,stderr);
	fputc('\n',stderr);
	exit(1);
}

结果:

 

 Linux平台与Windows平台下几乎没有太多差异。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lpl还在学习的路上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值