Socket编程中如何发送结构体,拼接多次接收消息及获取通信双方地址
2012-02-20 20:39
597 查看
客户端:
服务器端代码:
#include <iostream> #include <stdio.h> #include <string> #include "winsock.h" #pragma comment(lib, "wsock32") using namespace std; #define COMMAND 100 int main() { int ret = 0; WSADATA wsadata; WORD version = MAKEWORD(2,0); ret = WSAStartup(version,&wsadata); SOCKET m_hClientSocket; m_hClientSocket = socket(AF_INET,SOCK_STREAM,0); SOCKADDR_IN m_addr1; m_addr1.sin_family = AF_INET; m_addr1.sin_addr.S_un.S_addr = inet_addr("192.168.100.57"); m_addr1.sin_port = htons(10000); ret = connect(m_hClientSocket,(LPSOCKADDR)&m_addr1,sizeof(m_addr1)); char Clisend_msg[] = "我是客户端,请问你是那位?"; //char Clisend_msg[] = "hello, I am a client, and who are you?"; int len_send = send(m_hClientSocket,Clisend_msg,sizeof(Clisend_msg),0); //利用字符串发送,规定好字符串格式在服务器端接收后进行解析 /*char send_buf[1024] = "tony 2000 "; int len_send = send(m_hClientSocket,send_buf,sizeof(send_buf),0);*/ //使用结构体转换成字符串发送,在服务器端直接转为结构体 /* char send_buf[1024] = "tony 2000 "; memset(send_buf,0,1024); struct msg { int cmd; int sendID; int recvID; string name; int number; }; msg msg1; msg1.cmd = COMMAND; msg1.sendID = 2120100324; msg1.recvID = 2120100325; msg1.name = "Tony"; msg1.number = 2000; //以字符串形式发送,因为TCP/IP是字节流通信 //memcpy(send_buf,&msg1,sizeof(msg)); //int len_send = send(m_hClientSocket,send_buf,sizeof(send_buf),0); int len_send = send(m_hClientSocket,(char *)&msg1,sizeof(msg),0); */ closesocket(m_hClientSocket); WSACleanup(); return 0; }
服务器端代码:
#include <iostream> #include <stdio.h> #include <string> #include "winsock.h" #pragma comment(lib, "wsock32") using namespace std; int main() { //创建socket编程环境 int ret = 0; WSADATA wsadata; WORD version = MAKEWORD(2,0); ret = WSAStartup(version,&wsadata); //服务器端口创建 SOCKET m_hServerSocket; m_hServerSocket = socket(AF_INET,SOCK_STREAM,0); if(INVALID_SOCKET == m_hServerSocket) { cout << "服务器socket创建失败!" << endl; return 0; } else { cout << "服务器socket创建成功" << endl; } cout << endl; //服务器端口绑定 SOCKADDR_IN m_addr; m_addr.sin_family = AF_INET; m_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY); m_addr.sin_port = htons(10000); ret = bind(m_hServerSocket,(LPSOCKADDR)&m_addr,sizeof(m_addr)); //服务器端口开始监听 ret = listen(m_hServerSocket,20);//第二个参数指定最大申请的连接数 //每当有一个客户端连接申请,则服务器端创建一个线程对其进行处理,模拟数据库服务器的处理方式 SOCKET com_Sock; SOCKADDR_IN clntaddr; int clnlen = sizeof(clntaddr); struct msg { int cmd; int sendID; int recvID; string name; int number; }; msg msg2; while(1) { int count = 0; //com_Sock = accept(m_hServerSocket,NULL,NULL); com_Sock = accept(m_hServerSocket,(SOCKADDR *)&clntaddr,&clnlen); /*cout << inet_ntoa(clntaddr.sin_addr) << endl; getpeername(com_Sock,(SOCKADDR *)&clntaddr,&clnlen); cout << inet_ntoa(clntaddr.sin_addr) << endl;*/ getsockname(com_Sock,(SOCKADDR *)&clntaddr,&clnlen); cout << inet_ntoa(clntaddr.sin_addr) << endl; char recv_msg[16]; memset(recv_msg,0,16); ret = recv(com_Sock,recv_msg,sizeof(recv_msg),0); cout << ret << endl; //根据给定的字符串格式进行解析 /* for (int i=0;i<4;i++) { cout << recv_msg[i]; } cout << endl; for (int j=6; j<10; j++) { cout << recv_msg[j]; } cout << endl;*/ //直接将接收到的字节流拷贝给相应的结构体即可。 /* memset(&msg2,0,sizeof(msg)); memcpy(&msg2,recv_msg,sizeof(msg)); cout << msg2.cmd << endl; cout << msg2.sendID << endl; cout << msg2.recvID << endl; cout << msg2.name << endl; cout << msg2.number << endl; */ //在服务器端把多次接收的信息拼接到一起 char receive[1000]; memset(receive,0,sizeof(receive)); int k = 0; while (ret > 0) { for (int m=0; m<16; m++) { receive[k] = recv_msg[m]; k++; } cout << ret << endl; count += ret; //这里必须加上字符串结束标识,否则会乱码,虽然这已经不是这个 //数组的单元了。由字符串性质决定的。虽然接受字符串末尾的结束标识,但是如果分多次接收的时候就不行了 recv_msg[ret] = '\0'; cout << recv_msg << endl; ret = recv(com_Sock,recv_msg,sizeof(recv_msg),0); } cout << count << endl; cout << receive << endl; cout << strlen(receive) << endl; closesocket(com_Sock); } WSACleanup(); return 0; }
相关文章推荐
- Socket编程中如何发送结构体,拼接多次接收消息及获取通信双方地址
- Socket编程中如何发送结构体,拼接多次接收消息及获取通信双方地址
- python 网络编程之Socket通信案例消息发送与接收
- [Socket网络编程]由于套接字没有连接并且(当使用一个 sendto 调用发送数据报套接字时)没有提供地址,发送或接收数据的请求没有被接受。
- ServerSocket和Socket建立通信(客户端发送消息服务器接收输出)
- 如何获取/设置socket对应的内核缓冲区(发送,接收)的大小
- ServerSocket和Socket建立通信(客户端发送消息服务器接收并返回到客户端接收输出)
- ServerSocket和Socket建立通信(客户端发送消息服务器接收并返回到客户端接收输出)
- Socket编程之发送结构体报文
- as3.0和java服务端问题,如何让jiava立刻接收as发送的消息
- 如何在Qt中处理(接收/发送)MFC或Windows消息(直接覆盖MainDialog::nativeEvent,或者QApplication::installNativeEventFilter安装过滤器,或者直接改写QApplication::nativeEventFilter)
- Socket 通信发送和接收数据
- PHP-Socket服务端客户端发送接收通信实例详解
- Linux下发送与接收组播数据(socket编程)
- PHP-Socket服务端客户端发送接收通信实例详解
- XMPP系列(四)---发送和接收文字消息,获取历史消息功能
- XMPP系列(四)---发送和接收文字消息,获取历史消息功能
- android 蓝牙编程重点---如何发送和接收16进制数据
- C++网络编程 如何使用SOCKET 发送HTTP1.1 GET POST请求包
- socket接收消息拼接