TCP:可靠,稳定,对系统的资源要求高。
UDP:简单的面向数据报传输层协议,无连接,不可靠。无连接指通讯前不会确定对方的状态,不可靠是直接按照指定端口和IP发送数据,不在线的话可能丢失。
UDP发送和接收数据使用sendto和recvfrom。
服务器端代码:
#include <stdio.h>
#include <InitSock.h>
CInitSock InitSock;
int main()
{
SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s == INVALID_SOCKET)
{
printf("Failed socket() \n");
return 0;
}
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(4567);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
if(bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("Failed bind() \n");
return 0;
}
char buff[1024];
sockaddr_in addr;
int nLen = sizeof(addr);
while(TRUE)
{
int nRecv = recvfrom(s, buff, 1024, 0, (sockaddr*)&addr, &nLen);
if(nRecv > 0)
{
buff[nRecv] = '\0';
printf(" 接收到数据(%s):%s", ::inet_ntoa(addr.sin_addr), buff);
}
}
closesocket(s);
return 0;
}
客户端代码:
#include <InitSock.h>
#include <stdio.h>
CInitSock initSock;
int main()
{
SOCKET s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s == INVALID_SOCKET)
{
printf("Failed socket() %d \n", WSAGetLastError());
return 0;
}
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(4567);
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
char szText[] = " UDP Server Demo! \r\n";
sendto(s, szText, strlen(szText), 0, (sockaddr*)&addr, sizeof(addr));
closesocket(s);
return 0;
}
UDP和TCP的不同,和简单的UDP程序
本来第二章还有个时间校对的,但是换了几个服务器,老是连接不通,就不发了。