孙鑫 第十四课Socket编程之二 函数
来源:互联网 发布:淘宝页头装修素材 编辑:程序博客网 时间:2024/05/14 23:53
本文介绍Socket编程中用到的函数
①WSAStartup()
int WSAStartup(
WORD wVersionRequested, //请求的版本,可由函数MAKEWORD生成
LPWSADATA lpWSAData //[out], 函数返回后该结构体包含和Socket相关的一些参数信息
);
该函数成功返回0,否则可用 int WSAGetLastError(void)取得错误代码。
eg.
wVersionRequested = MAKEWORD(2, 0); //请求的版本号为2.0版
WSADATA wsaData;
if( 0!= WSAStartup(wVersionRequsted, &wsaData) )
{
cerr<<"startup error!"<<endl;
}
②LOBYTE / HIBYTE
BYTE LOBYTE(
WORD wValue
);
BYTE HIBYTE(
WORD wValue
);
函数功能:取得WORD类型变量的低字节 / 高字节
eg.
if( LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 0 )
{
cerr<<"version error"<<endl;
}
③socket
SOCKET socket(
int af, //必须为AF_INET
int type, //TCP为SOCK_STREAM, UDP为SOCK_DGRAM
int protocol //协议,一般为0,自动找合适的协议
);
函数功能:建立套接字
eg.
SOCKET sockServer = socket(AF_INET, SOCK_STREAM, 0);
④inet_addr / inet_ntoa
unsigned long inet_addr(
const char FAR* cp //点分十进制的IP地址
);
函数功能:把点分十进制的IP地址转化为网络字节序的IP地址
eg.
char *ip = "222.151.124.35";
inet_addr(ip);
char FAR* inet_ntoa(
struct in_addr in //包含IP地址的结构体变量,是SOCKADDR_IN结构体中的一个成员,具体见⑥bind中的介绍
);
函数功能:从一个strcut in_addr结构体中获得字符串类型的点分十进制IP地址
eg.
SOCKADDR_IN addr_client; //假设该变量已经被赋值
char *ip = inet_ntoa(addr_client.sin_addr);
⑤htos / htonl / ntohs / ntohl
h:host, n:net, s:short, l:long
u_short htons(
u_short hostshort
);//u_short类型主机字节序地址转化为u_short类型网络字节序地址
u_long htonl(
u_long hostlong
);//u_long类型主机字节序地址转化为u_long类型网络字节序地址
u_short ntohs(
u_short netshort
);//u_short类型网络字节序地址转化为u_short类型主机字节序地址
u_long ntohl(
u_long netlong
);//u_long类型网络字节序地址转化为u_long类型主机字节序地址
⑥bind
int bind(
SOCKET s, //本socket(服务器端或客户端)
const struct sockaddr FAR * name, // [in]绑定的地址端口结构体指针
int namelen //[in] 一般大小为sizeof(SOCKADDR)
);
函数功能:绑定套接字到指定的本地地址/端口
函数中的第二个参数sockaddr型结构体也可以写成大小的SOCKADDR,同时还有一个类似的结构体SOCKADDR_IN更加方便使用,
struct sockaddr_in{
short sin_family; //地址族, 必须是AF_INET
unsigned short sin_port; //端口,指定端口时必须转换为网络字节序: htons(端口号);
struct in_addr sin_addr; //IP地址在此结构体中
char sin_zero[8]; //仅占位用
};
struct in_addr {
union {
struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
struct { u_short s_w1,s_w2; } S_un_w;
u_longS_addr; //IP地址,需要网络字节序
} S_un;
#define s_addr S_un.S_addr
#define s_host S_un.S_un_b.s_b2
#define s_net S_un.S_un_b.s_b1
#define s_imp S_un.S_un_w.s_w2
#define s_impno S_un.S_un_b.s_b4
#define s_lh S_un.S_un_b.s_b3
};
eg.
SOCKADDR_IN addr_server;
char* ip = "127.0.0.1";
sockServer.sin_addr.S_un.S_addr = inet_addr(ip);
//上句也可以为 sockServer.sin_addr.s_addr = inet_addr(ip);
sockServer.sin_family = AF_INET;
sockServer.sin_port = htons(6000);
bind(sockServer, (SOCKADDR*) &addr_server, sizeof(SOCKADDR));
⑦listen
int listen(
SOCKET s,//本socket, 一般是TCP的服务器端
int backlog //请求队列中的最大客户端数,可以设置为SOMAXCONN
);
eg.
listen(sockServer, 5);
⑧accept
SOCKET accept(
SOCKET s, //本socket 一般为TCP服务器端
struct sockaddr FAR* addr, //[out],用来保存连接的客户端地址信息
int FAR* addrlen //[in, out] 必须赋初值, *addrlen初值一般为sizeof(SOCKADDR)
);
函数功能:(TCP服务器端)程序执行到此时阻塞,一直在此等候连接,连接到达后返回一个连接套接字,之后服务器端用此连接套接字和客户端通信。
eg.
SOCKADDR_IN addr_client;
int len = sizeof(SOCKADDR);
SOCKET sockConn = accept(sockServer, (SOCKADDR*) &addr_client, &len);//程序在此阻塞,一直有连接到来
⑨connect
int connect(
SOCKET s, //本socket,一般是TCP中客户端
const struct sockaddr FAR* name, //要连接的服务器地址结构体指针
int namelen //一般为sizeof(SOCKADDR)
);
函数功能:TCP中客户端向服务器发起连接请求
eg.
SOCKADDR_IN addr_server;
addr_server.sin_addr.s_addr = inet_addr("127.0.0.1");
addr_server.sin_family = AF_INET;
addr_server.sin_port = inet_htons(6000);
connect(sockClient, (SOCKADDR*) &addr_server, sizeof(SOCKADDR));
⑩send / sendto
TCP中用send,UDP中用sendto
int send(
SOCKET s , //本socket
const char FAR * buf, //要发送的缓存指针
int len,//要发送的内容长度,单位字节
int flags //为0即可
);
eg.
char sendBuffer[100] = "hello client!";
send(sockServer, sendBuffer, strlen(sendBuffer) + 1, 0);
int sendto(
SOCKET s, //本socket
const char FAR* buf,// 要发送的内容指针
int len, //要发送的内容长度
int flags, //为0即可
const struct sockaddr FAR* to, //目的地地址结构体(包括IP和端口)
int tolen //一般为sizeof(SOCKADDR)
);
eg.
char sendBuffer[100] = "hello server!";
SOCKADDR_IN addr_server;
addr_server.sin_addr.s_addr = inet_addr("127.0.0.1");
addr_server.sin_family = AF_INET;
addr_server.sin_port = htons(6000);
sendto(sockClient, sendBuffer, strlen(sendBuffer) + 1, 0, (SOCKADDR*) &addr_server, sizeof(SOCKADDR));
?recv / recvfrom
TCP中用recv, UDP中用recvfrom
int recv(
SOCKET s, //本socket
char FAR* buf, //内容接收到的缓冲区
int len, //接收len长度的内容
int flags //为0即可
);
eg.
char recvBuffer[100];
memset(recvBuffer, '\0', sizeof(recvBuffer));
recv(sockServer, recvBuffer, sizeof(recvBuffer), 0);
int recvfrom(
SOCKET s, //本socket
char FAR* buf, //接受到此缓冲区
int len, //接收len长度的内容
int flags, //为0即可
struct sockaddr FAR* from, //从此地址接收
int FAR* fromlen // *fromlen初值一般为sizeof(SOCKADDR)
);
eg.
char recvBuffer[100];
memset(recvBuffer, '\0', sizeof(recvBuffer));
SOCKADDR_IN addr_client;
addr_client.sin_addr.s_addr = inet_addr("222.195.158.17");
addr_client.sin_family = AF_INET;
addr_client.sin_port = htons(6000);
int len = sizeof(SOCKADDR);
recvfrom(sockServer, recvBuffer, sizeof(recvBuffer), 0, (SOCKADDR*)&addr_client, &len);
未尽事宜,请上google上百度一下,本日志解释权归三鹿牛奶所有!
- 孙鑫 第十四课Socket编程之二 函数
- 孙鑫 第十四课Socket编程之三 监听线程
- 孙鑫 第十四课Socket编程之四 实例UdpServerDlg.h
- 孙鑫 第十四课Socket编程之一 简介
- 孙鑫VC视频教程笔记之第十四课“基于TCP和UDP的Socket编程”
- 孙鑫VC视频教程笔记之第十四课“基于TCP和UDP的Socket编程”
- 孙鑫VC视频教程笔记之第十四课“基于TCP和UDP的Socket编程”
- 孙鑫VC视频教程笔记之第十四课“基于TCP和UDP的Socket编程”
- 网络编程之 Socket函数 (二)
- 网络编程之 Socket函数 (二)
- Java Socket编程之二
- 孙鑫VC学习笔记:第十四讲 (二) 网络编程
- linux socket编程之socket()函数介绍
- linux socket编程之socket()函数介绍
- linux socket编程之socket()函数介绍
- socket编程之accept()函数
- socket编程之bind()函数
- socket编程之select()函数
- sql server 2008 创建用户
- 关于c++中new / delete 一个不可饶恕的错误
- 【phpcms-v9】phpcms-v9中采集功能的使用
- 在unity3d中连接数据库
- 孙鑫 第十四课Socket编程之一 简介
- 孙鑫 第十四课Socket编程之二 函数
- VC-获得本机IP地址(大部分转,入选课文时有改动)
- 孙鑫 第十四课Socket编程之三 监听线程
- 孙鑫 第十四课Socket编程之四 实例UdpServerDlg.h
- 孙鑫 第十五/十六课之一 线程同步Mutex
- 使用java连接Mysql数据库 1
- 孙鑫 第十五/十六课之二 线程同步Semaphore
- 孙鑫 第十五/十六课之三 线程同步Event
- 孙鑫 第十五/十六课之四 线程同步CriticalSection