想给服务器发送变化的字串,来测试,觉得用C++中的string比较方便,发现string赋值给char数组有误,还以为,string有这样的复制构造函数搜了下可以通过如下方法解决
char buf[2048];
std::string sendMsg;
strcpy(buf,sendMsg.c_str());
完成的程序如下:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
using namespace std;
const int port=6789;
int main(int argc, char** argv) {
int socket_descriptor; //套接口描述字
int iter=0;
char buf[2048];
struct sockaddr_in address;//处理网络通信的地址
bzero(&address,sizeof(address));
address.sin_family=AF_INET;
address.sin_addr.s_addr=inet_addr("192.168.93.27");//这里不一样
address.sin_port=htons(port);
//创建一个 UDP socket
socket_descriptor=socket(AF_INET,SOCK_DGRAM,0);//IPV4 SOCK_DGRAM 数据报套接字(UDP协议)
std::string msg = "\"192.168.1.1\"}";
std::string sendMsg = "{\"playId\":";
std::string msgId = "0";
sendMsg += msgId + ",\"clientIp\":" + msg;
for(iter=0;iter< 10;iter++)
{
sendMsg[10] = iter + '0';
sendMsg[sendMsg.size() - 3] = iter + '0';
//buf = const_cast<char*>(sendMsg.c_str());
// buf = const_cast<char>(sendMsg.c_str());
strcpy(buf,sendMsg.c_str());
/*
* sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
* 将格式化后到 字符串存放到s当中
*/
//sprintf(buf,"{\"playId\": 1, \"clientIp\": \"192.168.23.97\"}");
cout << "buf:" << buf << endl;
/*int PASCAL FAR sendto( SOCKET s, const char FAR* buf, int len, int flags,const struct sockaddr FAR* to, int tolen);
* s:一个标识套接口的描述字。
* buf:包含待发送数据的缓冲区。
* len:buf缓冲区中数据的长度。
* flags:调用方式标志位。
* to:(可选)指针,指向目的套接口的地址。
* tolen:to所指地址的长度。
*/
sendto(socket_descriptor,buf,sizeof(buf),0,(struct sockaddr *)&address,sizeof(address));
sleep(1);
}
//sprintf(buf,"stop\n");
//sendto(socket_descriptor,buf,sizeof(buf),0,(struct sockaddr *)&address,sizeof(address));//发送stop 命令
close(socket_descriptor);
printf("Messages Sent,terminating\n");
return 0;
}
测试结果如下: