当程序创建套接字句柄成功后,便可以直接调用函数进行数据收发,最后,关闭套接字对象。
在UDP中进行数据收发的函数时sendto()和recvfrom()。
int sendto( SOCKET s, //套接字句柄 const char FAR* buf, //数据缓冲区 int len, //数据的长度 int flags, //一般设置成0 const struct sockaddr FAR* to, //目标地址结构信息 int tolen //目标地址结构大小 ); int recvfrom(SOCKET s, char FAR* buf, int len, int flags, struct sockaddr FAR* from, int FAR* fromlen); 参数from是指向地址结构sockaddr_in的指针,表示数据发送方的地址信息,参数fromlen表示该地址结构的大小。
// TCP服务器.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <WinSock2.h> #include <windows.h> #pragma comment(lib, "WS2_32.lib") int _tmain(int argc, _TCHAR* argv[]) { WSADATA data; WORD w = MAKEWORD(2, 0); //定义版本号码 char sztext[] = ("welcome yuippe\r\n"); ::WSAStartup(w, &data); //初始化套接字库 SOCKET s; //定义套接字句柄 s = ::socket(AF_INET, SOCK_DGRAM, 0); //创建TCP套接字 sockaddr_in addr, addr2; //定义套接字地址结构 int n = sizeof(addr2); //获取套接字地址结构大小 char buff[100] = {0}; //接收数据缓冲区 addr.sin_family = AF_INET; //初始化地址结构 addr.sin_port = htons(75); addr.sin_addr.S_un.S_addr = INADDR_ANY; ::bind(s, (sockaddr*)&addr, sizeof(addr)); printf("UDP服务器已经启动\r\n"); while(1){ if (::recvfrom(s, buff, 100, 0, (sockaddr*)&addr2, &n) != -1) //接收客户端信息 { printf("%s已经连接上\r\n", inet_ntoa(addr2.sin_addr)); printf("%s\r\n", buff); ::sendto(s, sztext, sizeof(sztext), 0, (sockaddr*)&addr2, n); }}::closesocket(s); ::WSACleanup();if (getchar()){return 0;}else{::Sleep(100);}return 0;}
UDP客户端:// TCP客户端.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <WinSock2.h> #pragma comment(lib, "WS2_32.lib") int _tmain(int argc, _TCHAR* argv[]) { WSADATA data; WORD w = MAKEWORD(2, 0); ::WSAStartup(w, &data); SOCKET s; char sztext[] = "服务器,你好!\r\n"; s = ::socket(AF_INET, SOCK_DGRAM, 0); sockaddr_in addr, addr2; int n = sizeof(addr2); char buff[100] = {0}; addr.sin_family = AF_INET; addr.sin_port = htons(75); addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); printf("UDP客户端已经启动\r\n"); if(::sendto(s, sztext, sizeof(sztext), 0, (sockaddr*)&addr, n) != 0) { ::recvfrom(s, buff, 100, 0, (sockaddr*)&addr2, &n); printf("服务器说: %s\r\n", buff); } ::closesocket(s); ::WSACleanup(); if (getchar()) { return 0; } else { ::Sleep(100); } return 0; }