【socket】有关socket的编程<一>
2015-09-03 20:30
399 查看
有关TCP方式的socket网络通信的编程
以下代码都能编译通过
1. 客户端代码
2.服务端代码
效果图:
以下代码都能编译通过
1. 客户端代码
[code]#include <WinSock2.h> #include <stdio.h> #include <iostream> using namespace std; void main() { WORD wVersionRequest; WSADATA wsadata; int err; wVersionRequest=MAKEWORD(1,1); err=WSAStartup(wVersionRequest,&wsadata); if(err!=0) { return; } if(LOBYTE(wsadata.wVersion)!=1||HIBYTE(wsadata.wVersion)!=1) { WSACleanup(); return; } SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1"); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); //客户端不需要绑定,可以直接连接服务器端 connect与服务器建立一个连接 //设定服务器端的IP地址和端口 connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); char recvBuf[100]; recv(sockClient,recvBuf,100,0); printf("client:%s\n",recvBuf); send(sockClient,"This is kisi",strlen("This is kisi")+1,0); closesocket(sockClient); WSACleanup(); //cout<<"hello world!"<<endl; }
2.服务端代码
[code]#include <WinSock2.h> #include <stdio.h> #include <iostream> using namespace std; //TCP里的过程比较复杂 而UDP里的内容相对来说简化了很多 void main() { WORD wVersionRequest; WSADATA wsadata; int err; WORD wVersionRequested; wVersionRequested=MAKEWORD(2,2); //0000 0010 0000 0010 = 512+2=514 输出 cout << wVersionRequested << endl; wVersionRequested=MAKEWORD(2,1); //0000 0001 0000 0010 =256+2=258 1在高八位 cout << wVersionRequested << endl; //WORD MAKEWORD(BYTE bLow, //指定新变量的低字节序;BYTE bHigh //指定新变量的高字节序;); //高位字节指出副版本(修正)号,低位字节指明主版本号. wVersionRequest=MAKEWORD(1,1); //MAKEWORD(1,1)和MAKEWORD(2,2)的区别在于,前者只能一次接收一次,不能马上发送,而后者能。 //加载套接字 err=WSAStartup(wVersionRequest,&wsadata); //版本号 if(err!=0) return; if(LOBYTE(wsadata.wVersion)!=1||HIBYTE(wsadata.wVersion)!=1) //取低八位和高八位 { WSACleanup(); //释放为该应用程式分配的资源 return; } //#define AF_INET 2 // internetwork: UDP, TCP, etc. //#define SOCK_STREAM 1 /* stream socket */ //#define SOCK_DGRAM 2 /* datagram socket */ SOCKET sockSrc=socket(AF_INET,SOCK_STREAM,0); //第三个参数是protpcol 推荐使用0 //typedef UINT_PTR SOCKET; 其实就是int型 printf("Socket : %d\n",sockSrc); //548 ? SOCKADDR_IN addrSrv; addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //套接字的主机IP 本函数将一个32位数从主机字节顺序转换成网络字节顺序 addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); //本函数将一个16位数从主机字节顺序转换成网络字节顺序。 只是端口号 //#define s_addr S_un.S_addr /* can be used for most tcp & ip code */ //#define INADDR_ANY (ULONG)0x00000000 //绑定 套接字的本地地址信息 地址结构的长度 // ADDRESS_FAMILY sa_family; // Address family. bind(sockSrc,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); //绑定创建的套接字 要绑定的IP地址信息 地址信息 的长度 //监听模式 listen(sockSrc,5); //第二个参数是等待连续队列的最大长度 SOCKADDR_IN addrClient; //实际接收的实体地址 int len=sizeof(SOCKADDR); while (1) { //接收客户端发来的请求 accepet //指向一个缓冲区的指针,该缓冲区用来接收连接实体的地址,也就是保存客户端IP的地址信息和端口信息 SOCKET sockConn=accept(sockSrc,(SOCKADDR*)&addrClient,&len); //返回地址信息的长度 // _Out_writes_bytes_opt_(*addrlen) struct sockaddr FAR * addr, // _Inout_opt_ int FAR * addrlen //有out说明都是传出来的特征 属性 变量 * 指定了以指针地址的方式传出来!!!【类似toolkit中的API】 char sendBuf[100]; sprintf(sendBuf,"Welcome %s to ....",inet_ntoa(addrClient.sin_addr)); // inet_ntoa将一个IP转换成一个互联网标准点分格式的字符串 //第二个传出来的参数addrClient 带了很多地址方面的详细信息 可以打出来 使用特定的函数 inet_ntoa //send通过已经建立连接的套接字发送数据 send(sockConn,sendBuf,strlen(sendBuf)+1,0); //已经建立连接的套接字 第二个参数是指要传递的数据 和客户端连接 客户端也有一个自己的套接字 char recvBuf[100]; //recv 从一个已经连接的套接字接收数据 recv(sockConn,recvBuf,100,0); //第二个参数是用来保存数据缓冲区 printf("%s\n",recvBuf); closesocket(sockConn); } //connect //recvform //sendto //htons htonl }
效果图:
相关文章推荐
- 隐藏实施过程
- Spring data 规范
- java 常用方法
- 三、NoteEditor.java文件学习笔记
- 【英语】Bingo口语笔记(63) - 一个单词的多种发音
- Delphi考虑sql注入 QuotedStr
- 【英语】Bingo口语笔记(62) - 生气道歉场景的表达
- 初始化和清除
- Java中多线程重复启动
- Ruby on Rails Guides(一)
- 20150902 Java学习笔记-构造方法,关键字,封装性
- C++模板元编程 - 3 逻辑结构,递归,一点列表的零碎,一点SFINAE
- 如何写memset函数
- 【Socket】MFC之编写聊天通信代码
- 控制程序流程
- Java中@Override的作用
- C++基础---主函数
- java下io文件切割合并功能
- 实现抽取java中的注释的代码
- 一切都是对象