windows网络编程socket) c语言socket网络编程
端口号标识在同一台计算机上运行的不同网络程序。
1.socket函数
SOCKET socket(int af, int type, int protocol)
af: 地址族,对于TCP/IP只能是AF_INET(PF_INET)
type: Socket类型,SOCK_STREAM SOCK_DGRAM
potpcol:协议, 为0则根据地址格式调整套接字类别,自动选择一个合适的协议(推荐)。
调用成功,返回SOCKET套接字描述符,否则返回INVALID_SOCKET
2.bind函数
创建完套接字,将其绑定到本地的某个地址和端口。
int bind(SOCKET s, const struct sockaddr FAR* name, intnamelen);
s:需要绑定的套接字
name:指向sockaddr结构,制定了该套接字本地信息
namelen: 该地址结构的长度
struct sockaddr
{
u_shortsa_family;
charsa_data[14];
}
sa_family:地址家族,对于TCP/IP,设置为AF_INET
sa_data:指定区域,与协议相关的具体地址信息。
可用sockaddr_in结构替换sockaddr
struct sockaddr_in
{
shortsin_family;//地址族,对于IP地址一直为AF_INET
unsignedshort sin_port;//分配给套接字的端口
structin_addr sin_addr; //套接字主机的IP地址
charsin_zero[8]; //填充数,使和sockaddr长度一样
}
bind函数调用成功返回0,调用失败返回SOCKET_ERROR
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_long S_addr;
}S_un;
}常用这个结构将十进制格式的IP地址转换为u_long类型,并将结果赋值给S_addr.
将IP地址指定为INADDR_ANY,允许套接字向任何分配给本地机器的IP地址发送或接受数据,可以简化编程。
如果只想让套接字使用多个IP中的一个地址,必须指定实际地址,可用inet_addr函数实现。
unsigned long inet_addr(const char FAR* cp)
inet_ntoa函数完成相反的操作
char FAR* inet_ntoa(struct in_addr_in);
3.listen函数
可设置套接字为监听模式
int listen(SOCKET s, int backlog);
s: 套接字描述符
backlog:等待连接队列的最大长度.设置为SOMAXCONN,将由下层的服务提供者负责将这个套接字设置为最大的合理值。
4.accept函数
接收客户端的连接请求
int accept(SOCKET s, struct sockaddr FAR* addr; int FAR*addrlen);
s:套接字描述符,并且已经通过listen函数设置为监听状态
addr:指缓冲区,该缓冲区用来保存接收连接实体的地址(连接客户的IP地址,端口等)
addrlen: 地址信息的长度
返回地址长度
5.send函数
int send(SOCKET s, cosnt char FAR* buf; int len; int flags);
flags一般设置为0即可
buf指向要发送的缓冲区
len为缓冲区的长度
6.recv函数
int recv(SOCKET s,char FAR* buf,int len, int flags);
7.connect函数
int connect(SOCKET s, const struct sockaddr FAR* name, intnamelen);
name 为连结的服务器端地址信息
8.recvfrom函数
int recvfrom(SOCKET s, char FAR* buf, ine len ,int flags, structsock_addr FAR* from, int FAR* fromlen);
s;准备接收的套接字
from:用来接收发送端得地址信息
返回地址结构的大小
9.sendto函数
int sendto(SOCKET s, const char FAR* buf, int len, int flags, conststruct sockaddr FAR* to, int tolen)
to指定目标套接字的地址
例程:
初始化套接字:
BOOL InitSocket()
{
m_socket=socket(AF_INET,SOCK_DGRAM,0);//创建套接字
if(INVALID_SOCKET==m_socket)
{
MessageBox(NULL,TEXT("套接字创建失败!"),TEXT("错误"),MB_OK);
returnFALSE;
}
SOCKADDR_INaddrSock;
addrSock.sin_family=AF_INET;
addrSock.sin_port=htons(5000);//端口,htons的功能:将一个无符号短整型数值转换为网络字节序,即大端模式(big-endian)
addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//向本地所有IP地址分配数据
intretval;
retval=bind(m_socket,(SOCKADDR*)&addrSock,sizeof(SOCKADDR));//绑定
if(SOCKET_ERROR==retval)
{
closesocket(m_socket);
MessageBox(NULL,TEXT("绑定失败"),TEXT("绑定错误"),MB_OK);
returnFALSE;
}
returnTRUE;
}
发送:
SOCKADDR_INaddrTo;
DWORD dwIP =-1062731414; //192.168.1.106
//((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESS))->GetAddress(dwIP);//CIPAddressCtrl类wince不支持
addrTo.sin_family=AF_INET;
addrTo.sin_port=htons(5000);
addrTo.sin_addr.S_un.S_addr=htonl(dwIP);
char sendBuf[5];//转弯角度为45,90,135,180,分别用字符'1','2','3'和'4'表示
sendBuf[0]='y';//右转
sendBuf[1]=anglechar;//右转角度
sendBuf[2]=m_percent[0];//占空比
sendBuf[3]=m_percent[1];//占空比
sendto(m_socket,sendBuf,4,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
更多阅读
Windows 7中清理c盘方法 c盘windows文件夹清理
装完Win7 C盘本来还有50G的空余空间,可没过多久就只剩了1、2G了,这种情况经常出现。那么究竟我们电脑的C盘里有些什么东西在作怪,怎样才能简单方便的清除它们,下面就让我们来一起看一下C盘的奥秘吧。Windows 7中清理c盘方法——工具/原
转载 C语言:随机函数rand()、srand()、random()和rando
原文地址:C语言:随机函数rand()、srand()、random()和randomized()的区别和用法作者:猎空声明一点:在VC++中,没有random()和randomize()函数,只有rand()和srand()函数。其中,random()和randomize()函数的使用的方法分别与rand()和srand()
使用Visual C++6.0编写简单C语言程序入门教程 visual c 编写c语言
使用Visual C++6.0编写简单C语言程序入门教程——简介本教程适用于C语言初学者,使用VC++6.0编写简单的程序。Visual C++6.0作为学习C语言的编程工具在合适不过了,工具比较简洁,容易上手。下面我将一步步带领大家一步步操作,教会大家如何
转载 C语言贪心算法 c语言贪心算法
你真牛原文地址:C语言贪心算法作者:人鱼的泪贪心算法开放分类:算法、信息学贪心算法所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最
单片机C语言程序设计实训100例——基于PIC+Proteus仿真 pic单片机c语言教程
书名:单片机C语言程序设计实训100例——基于PIC+Proteus仿真作者:彭伟定价:88出版日期:2011-12内容简介:本书基础设计类案例涵盖PIC单片机最基本的端口编程、定时/计数器应用、中断程序设计、A/D转换、