c语言网络通信编程_第1页
c语言网络通信编程_第2页
c语言网络通信编程_第3页
c语言网络通信编程_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C 语言网络通信编程 2010-07-26 09:05:12 我来说两句 收藏 我要投稿 字体:小 大 网络编程的基本概念: 1. 基本结构 struct sockaddr unsigned short sa_family; char sa_data14; ; struct sockaddr_in short int sin_family; unsigned short int sin_port; struct in_addr sin_addr; unsigned char sin_zero8; ; struct in_addr unsiged long s_addr; ; 说明:sockaddr 结构是用于函数参数使用的,sockaddr_in 其实内部数据和 sockaddr 结构一 样,只不过定义不一样,定义 sockaddr_in 结构只是为了编程是填入地址族,ip 地址和端口 方便,在调用套接字函数时,需要强制类型转换为 sockaddr。为什么这么做,估计是 sockaddr 结构定义的比较早,所以不忍丢弃。 2. 基本转换函数 *网络字节顺序:网络采用大尾方式,inter386 采用小尾方式 *网络数字转换 htos host to network short hotl host to network long ntos network to host short ntol network to host long *网络地址转换 inet_addr() 将字符串型 IP 地址转换为无符号 long int inet_ntoa() 将 IP 地址数字转换为字符串 3. 基本套接字函数 这里只说其中几个比较重要的函数 socket(ip_family,data_type,protocol); bind(socket, struct sockaddr, len); 指定一个本地的端口用来进行通信,使用本地 ip 和 port 填充结构 connect(socket,struct sockaddr,len); 任意指定一个未用端口,内部调用 bind 进行绑定,使用远程 ip 和 port 填充结构 listen(socket,backlog); backlog 未经处理的连接请求队列中可以容纳的最大数目。 accept(listen_socket,out struct sockaddr,len); accept 拿出 listen 函数放入等待队列中的第一条消息进行处理,然后返回这个消息的管理 套接字。 注意:在服务器端,函数 listen 会将在客户端函数 connect 发来的请求排成队列,然后交由 accept 来处理,因此函数 accept 返回客户端通信套接字,并返回客户端的 ip 地址,通信端 口等信息;在客户端,connect 函数在内部任意指定一个未用端口,然后绑定,用于和服务 器端通信。 accept 如果接不到请求,会阻塞。 accept 如果接到请求,TCP 的 3 次握手过程已完成,后面就可以用 send 和 recv 函数发送和 接受数据。 4. 代码示例 客户端代码: #include #include #include #pragma comment(lib,“ws2_32.lib“) int main() WSADATA WSData; SOCKET ConnectSocket; if (WSAStartup(MAKEWORD(2,2), return 1; ConnectSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (ConnectSocket = SOCKET_ERROR) printf(“create socket error! “); WSACleanup(); return 1; sockaddr_in Client; Client.sin_family = AF_INET; Client.sin_addr.s_addr = inet_addr(“192.168.8.21“); Client.sin_port = htons(4600); / connect to server if (connect(ConnectSocket,(sockaddr*) return 1; / translate data char SendBuf100 = “hi“; send(ConnectSocket,SendBuf,lstrlenA(SendBuf)+1,0); char RecvBuf101; recv(ConnectSocket,RecvBuf,lstrlenA(RecvBuf)+1,0); printf(“%s “,RecvBuf); / close socket closesocket(ConnectSocket); WSACleanup(); return 0; 服务器端代码: #include #include #include #pragma comment(lib,“ws2_32.lib“) int main() WSADATA wsaData; SOCKET ListenSocket; int iResult; / 初始化 socket iResult = WSAStartup(MAKEWORD(2,2), if(iResult != 0) printf(“WSAStartup failed:%d “,iResult); return 1; / 创建 socket ListenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); if (ListenSocket = INVALID_SOCKET) printf(“Error at socket():%d “,WSAGetLastError(); WSACleanup(); return 1; / band socket sockaddr_in service; service.sin_family = AF_INET; service.sin_addr.s_addr = inet_addr(“192.168.8.21“); service.sin_port = htons(4600); if (bind(ListenSocket,(sockaddr*) closesocket(ListenSocket); return 1; / listen socket if (listen(ListenSocket,SOMAXCONN) = SOCKET_ERROR) printf(“listen() failed. “); closesocket(ListenSocket); return 1; / accept a socket and use it recv or send sockaddr_in Client; SOCKET ConnectSocket; int len = sizeof(sockaddr_in); while (1) ConnectSocket= accept(ListenSocket,(sockaddr*) char RecvBuf100; recv(ConnectSocket,RecvBuf,lstrlenA(RecvBuf)+1,0); printf(“%s “,RecvBuf); char SendBuf10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论