1.代码
/* * File: HeartPackageSendAgent.cpp * Author: Pangxiaojian * * * 主要实现:向服务器发送心跳包,每5s向服务器发送一个心跳包 * File: HeatPackageAgent.c * Author: Pangxiaojian * */ #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 <net/if.h> #include <sys/ioctl.h> #include <pthread.h> #include <unistd.h> #define MAXLINE 80 #define SERV_PORT 8000 const int HeatPort = 6789; //?? const char ServerIP[255] = "192.168.18.128"; void getIPHost(char** iphost) { /* int sock; struct sockaddr_in sin; struct ifreq ifr; sock = socket(AF_INET,SOCK_DGRAM,0); int i; int j; for(i = 0; i<10;i++) { char* ENAME = (char*)malloc(5*sizeof(char)); bzero(ENAME,5);// sprintf(ENAME,"%s%d",ETH_NAME,i); strncpy(ifr.ifr_name,ENAME,IFNAMSIZ); free(ENAME); ifr.ifr_name[IFNAMSIZ - 1] = 0; if(ioctl(sock,SIOCGIFADDR,&ifr) >= 0) goto HERE; } for(j = 0; j < 10; j++) { char* WNAME = (char*)malloc(6*sizeof(char)); bzero(WNAME, 6); sprintf(WNAME, "%s%d", WTH_NAME, j); strncpy(ifr.ifr_name, WNAME, IFNAMSIZ); free(WNAME); ifr.ifr_name[IFNAMSIZ - 1] = 0; if (ioctl(sock, SIOCGIFADDR, &ifr) >= 0) goto HERE; } */ int inet_sock; struct sockaddr_in sin; struct ifreq ifr; inet_sock = socket(AF_INET,SOCK_DGRAM,0); strcpy(ifr.ifr_name,"eth0"); if(ioctl(inet_sock,SIOCGIFADDR,&ifr)>=0) { perror("ioctl"); printf("%s ",inet_ntoa(((struct sockaddr_in*)&(ifr.ifr_addr))->sin_addr)); goto HERE; } HERE: memcpy(&sin,&ifr.ifr_addr,sizeof(sin)); char* hostname = (char*)malloc(256*sizeof(char)); bzero(hostname, 256); gethostname(hostname, 256*sizeof(char)); char* ip = inet_ntoa(sin.sin_addr); int lenhost = strlen(hostname); int lenip = strlen(ip); *iphost = (char*)malloc((lenhost+lenip+2)*sizeof(char)); bzero(*iphost, (lenhost+lenip+2)*sizeof(char)); sprintf(*iphost, "%s:%s", ip, hostname); free(hostname); } int heart_send() { char send_buf[MAXLINE]; char recv_buf[MAXLINE]; char *iphost = NULL; int sockfd = socket(AF_INET, SOCK_DGRAM, 0); struct sockaddr_in cliaddr;//host cliaddr.sin_family = AF_INET; cliaddr.sin_addr.s_addr = inet_addr(ServerIP);//host ip cliaddr.sin_port = htons(SERV_PORT); bind(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr)); getIPHost(&iphost); memcpy(send_buf,iphost,strlen(iphost));//heart packet while (1) { struct sockaddr_in servaddr; socklen_t servaddr_len = sizeof(servaddr); int count = recvfrom(sockfd, recv_buf, MAXLINE, 0, (struct sockaddr *)&servaddr, &servaddr_len); if (count < 0) { printf("recvfrom error"); continue; } printf("received msg is %s ",recv_buf); sendto(sockfd, send_buf, sizeof(send_buf), 0, (struct sockaddr *)&servaddr, sizeof(servaddr)); sleep(5); } close(sockfd); //return ((void*)l); } int main() { pthread_t m_threadHeartSend; int *ret_join = NULL; if (pthread_create(&m_threadHeartSend, NULL, &heart_send, NULL) != 0) return -1; pthread_join(m_threadHeartSend,(void*)&ret_join); }
2.编译命令为 gcc main.c -o test
时,会出现如下错误
/tmp/ccCuKQ9a.o: In function `main': |
3.原因和解决方法
问题的原因:pthread不是linux下的默认的库,也就是在链接的时候,无法找到phread库中哥函数的入口地址,于是链接会失败。 解决:在gcc编译的时候,附加要加 -lpthread参数即可解决。 试用如下命令即可编译通过
|
4.参考链接
https://www.cnblogs.com/langzou/p/7364014.html |