当程序创建套接字句柄成功后,便可以直接调用函数进行数据收发,最后,关闭套接字对象。
在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表示该地址结构的大小。
UDO服务器:
// 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;
}