将TCP的服务器客户端重新写一遍
服务器
#include <myhead.h>
#define ERR_MSG(msg) do{\
printf("__%d__\n",__LINE__);\
perror(msg);\
}while(0)
#define IP "192.168.222.163"
int main(int argc, const char *argv[])
{
//創建socket套接字
int sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd<0)
{
ERR_MSG("socket");
return -1;
}
//允许端口快速被重用
int reuse = 1;
if(setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速被重用成功\n");
struct sockaddr_in sin;
sin.sin_family=AF_INET;
sin.sin_port=htons(6666);
sin.sin_addr.s_addr=inet_addr(IP);
//綁定服務器ip和端口號
if((bind(sfd,(struct sockaddr *)&sin,sizeof(sin)))<0)
{
ERR_MSG("bind");
return -1;
}
//設置套接字被動監聽,維護客戶端鏈接
if(listen(sfd,128)<0)
{
ERR_MSG("listen");
return -1;
}
printf("listen success\n");
struct sockaddr_in cin;
socklen_t addrlen=sizeof(cin);
//阻塞等待鏈接成功,從已鏈接的客戶端獲取信息,生成新的套接字
int newfd=accept(sfd,(struct sockaddr *)&cin,&addrlen);
if(newfd<0)
{
ERR_MSG("accept");
return -1;
}
printf("[%s : %d] newfd=%d 客戶端鏈接成功\n",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);
char buf[128]="";
ssize_t res=0;
while(1)
{
bzero(buf,sizeof(buf));
res=recv(newfd,buf,sizeof(buf),0);
if(res<0)
{
ERR_MSG("recv");\
return -1;
}
else if(res==0)
{
printf("[%s : %d] newfd=%d 客戶端下線\n",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd);
break;
}
printf("[%s : %d] newfd=%d %s\n",\
inet_ntoa(cin.sin_addr),ntohs(cin.sin_port),newfd,buf);
printf("請輸入>>>");
fgets(buf,sizeof(buf),stdin);
buf[strlen(buf)-1] = 0;
if(send(newfd,buf,sizeof(buf),0)<0)
{
ERR_MSG("send");
return -1;
}
printf("發送成功\n");
}
close(newfd);
if(close(newfd)<0)
{
ERR_MSG("close");
return -1;
}
return 0;
}
客户端
#include <myhead.h>
#define ERR_MSG(msg) do{\
printf("__%d__",__LINE__);\
perror(msg); \
}while(0)
#define IP "192.168.222.163"
int main(int argc, const char *argv[])
{
//printf("%d %s %s\n",__LINE__,__func__,__FILE__);
//創建流式套接字
int cfd=socket(AF_INET,SOCK_STREAM,0);
if(cfd<0)
{
ERR_MSG("socket");
return -1;
}
//允許端口快速被重用
int reuse =1;
if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速被重用成功\n");
//填充服務器的地址信息結構體. AF_INET :man 7 ip
struct sockaddr_in sin;
sin.sin_family =AF_INET;//必須填 AF_INET
sin.sin_port =htons(6666);//端口號的網絡字節序,1024-49151
sin.sin_addr.s_addr =inet_addr(IP);//本機IP的網絡字節序
//綁定客戶端ip和端口
/* if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))<0)
{
ERR_MSG("bind");
return -1;
}
printf("bind success\n");*/
//鏈接到服務器
if(connect(cfd,(struct sockaddr *)&sin,sizeof(sin))<0)
{
ERR_MSG("connect");
return -1;
}
printf("connect success\n");
char buf[128]="";
ssize_t res=0;
while(1)
{
bzero(buf,sizeof(buf));
//发送数据
printf("请输入>>> ");
fgets(buf, sizeof(buf), stdin);
buf[strlen(buf)-1] = 0;
//对方接收多少个字节,发送多少个字节
if(send(cfd, buf, sizeof(buf), 0) < 0)
{
ERR_MSG("send");
return -1;
}
printf("发送成功\n");
bzero(buf, sizeof(buf));
//接收数据
res = recv(cfd, buf, sizeof(buf), 0);
if(res < 0)
{
ERR_MSG("recv");
return -1;
}
else if(0 == res)
{
printf("cfd=%d 服务器下线\n", cfd);
break;
}
printf("cfd=%d : %s\n", cfd, buf);
}
close(cfd);
//關閉文件描述符
if(close(cfd)<0)
{
ERR_MSG("close");
return -1;
}
return 0;
}
自行编写一个客户端代码,能够操作红色手臂移动到16度
#include <myhead.h>
#define ERR_MSG(msg) do{\
printf("__%d__",__LINE__);\
perror(msg); \
}while(0)
#define IP "192.168.222.175"
int main(int argc, const char *argv[])
{
//printf("%d %s %s\n",__LINE__,__func__,__FILE__);
//創建流式套接字
int cfd=socket(AF_INET,SOCK_STREAM,0);
if(cfd<0)
{
ERR_MSG("socket");
return -1;
}
//允許端口快速被重用
int reuse =1;
if(setsockopt(cfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0)
{
ERR_MSG("setsockopt");
return -1;
}
printf("允许端口快速被重用成功\n");
//填充服務器的地址信息結構體. AF_INET :man 7 ip
struct sockaddr_in sin;
sin.sin_family =AF_INET;//必須填 AF_INET
sin.sin_port =htons(8888);//端口號的網絡字節序,1024-49151
sin.sin_addr.s_addr =inet_addr(IP);//本機IP的網絡字節序
//綁定客戶端ip和端口
/* if(bind(sfd,(struct sockaddr *)&sin,sizeof(sin))<0)
{
ERR_MSG("bind");
return -1;
}
printf("bind success\n");*/
//鏈接到服務器
if(connect(cfd,(struct sockaddr *)&sin,sizeof(sin))<0)
{
ERR_MSG("connect");
return -1;
}
printf("connect success\n");
char buf[128]="";
ssize_t res=0;
//发送数据
uint8_t a[5]={0xff,0x02,0x00,0x10,0xff};
//对方接收多少个字节,发送多少个字节
if(send(cfd, a, sizeof(a), 0) < 0)
{
ERR_MSG("send");
return -1;
}
printf("发送成功\n");
/* bzero(buf, sizeof(buf));
//接收数据
res = recv(cfd, buf, sizeof(buf), 0);
if(res < 0)
{
ERR_MSG("recv");
return -1;
}
else if(0 == res)
{
printf("cfd=%d 服务器下线\n", cfd);
break;
}
printf("cfd=%d : %s\n", cfd, buf);*/
close(cfd);
//關閉文件描述符
if(close(cfd)<0)
{
ERR_MSG("close");
return -1;
}
return 0;
}