您的位置:首页 > 理论基础 > 计算机网络

网络编程 TCP

2015-07-27 16:38 531 查看
参考孙鑫视频...

TCP:Transmission Control Protocol 传输控制协议。

UDP(User Datagram Protocol),用户数据包协议。

TCP和UDP对比:

a)TCP是面向连接的传输控制协议,而UDP提供了面向无连接的数据报服务

b)TCP具有高可靠性,确保数据的正确性,不出现丢失和乱序;比如下载程序,用的肯定是TCP协议

UDP在传输前不建立连接,不对数据报进行检查和修改,无需等待对方的应答,所以会出现分组丢失、重复、乱序、

应用程序需要负责传输可靠性方面的所有工作。

c)由于以上特征,UDP具有较好的实时性,工作效率比TCP高。在一些聊天程序中往往使用UDP协议。

UDP的段结构比TCP的段结构简单,因此网络开销小。

1、服务器端程序

#include <WinSock2.h>
#include <stdio.h>

int main()
{
	//加载套接字库,1.1版本
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD( 1, 1 );

	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) 
	{
		return 0;
	}

	if ( LOBYTE( wsaData.wVersion ) != 1 ||
		HIBYTE( wsaData.wVersion ) != 1 ) 
	{
			WSACleanup( );
			return 0; 
	}
	
	//创建套接字
	SOCKET sockSrv = socket(AF_INET,SOCK_STREAM,0);
	//bind,将套接字绑定到一个本地地址和端口上
	SOCKADDR_IN addrSrv;
	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
	addrSrv.sin_family = AF_INET;
	addrSrv.sin_port = htons(6000);
	
	bind(sockSrv,(SOCKADDR *)&addrSrv,sizeof(SOCKADDR));
	//监听
	listen(sockSrv,5);
	//accept 接收
	SOCKADDR_IN addrCli;//用于接收从客户端传来的地址信息和端口信息
	int len = sizeof(SOCKADDR);
	

	while(true)
	{
		SOCKET sockCli = accept(sockSrv,(SOCKADDR *)&addrCli,&len);//用此次返回的套接字进行通信
		char sendBuf[100];
		sprintf(sendBuf,"welcome %s to http://www.sau.com",inet_ntoa(addrCli.sin_addr)); 		send(sockCli,sendBuf,sizeof(sendBuf)+1,0);

		char recvBuf[100];
		recv(sockCli,recvBuf,sizeof(recvBuf),0);
		printf("%s\n",recvBuf);
		closesocket(sockCli);

	}

}


2、客户端程序

#include <WinSock2.h>
#include <stdio.h>

int main()
{
	//加载套接字库,1.1版本
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;

	wVersionRequested = MAKEWORD( 1, 1 );

	err = WSAStartup( wVersionRequested, &wsaData );
	if ( err != 0 ) 
	{
		return 0;
	}

	if ( LOBYTE( wsaData.wVersion ) != 1 ||
		HIBYTE( wsaData.wVersion ) != 1 ) 
	{
		WSACleanup( );
		return 0; 
	}
	//创建套接字
	SOCKET sockClinet = socket(AF_INET,SOCK_STREAM,0);
	//
	SOCKADDR_IN addrSer;//要发送给的服务端的地址信息和端口号
	addrSer.sin_addr.S_un.S_addr = inet_addr("59.73.163.254");
	addrSer.sin_family = AF_INET;
	addrSer.sin_port = htons(6000);
	//连接
	connect(sockClinet,(SOCKADDR *)&addrSer,sizeof(SOCKADDR));
	
	char recvBuf[100];
	recv(sockClinet,recvBuf,100,0);
	printf("%s\n",recvBuf);
	send(sockClinet,"this is liushuanpeng",strlen("this is liushuanpeng")+1,0);

	closesocket(sockClinet);
	WSACleanup();//终止套接字库的使用

}


3、程序编写流程:



note:别忘记附加ws2_32.lib库。然后再建立套接字和绑定时,可以写if语句判断一下,创建套接字、绑定是否成功等。WSAGetLastError()函数可以输出错误码。可以到VS--工具--错误查找中,输入该错误码查找错误!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: