客户端的实现,实现双方聊天及多方消息收发
再学习这篇内容前,需要了解下上章服务器相关内容。linux服务器
客户端实现
与服务端相比,客户端实现的操作和步骤就简单很多。
需要套接字和connect两个步骤
代码实现如下:
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
//int connect(int sockfd, const struct sockaddr *addr,
// socklen_t addrlen);
int main()
{
int c_fd;
char readbuf[128];
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
c_fd = socket(AF_INET,SOCK_STREAM,0);
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(8666);
inet_aton("192.168.1.88",&c_addr.sin_addr);
connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr_in));//配置内容与客户端一样
printf("get success,连接设备的IP为%s\n",inet_ntoa(c_addr.sin_addr));
read(c_fd,readbuf,sizeof(readbuf));
write(c_fd,"hello i am client",strlen("hello i am client"));
printf("content:%s\n",readbuf);
return 0;
}
我们再配合下面服务器代码
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
//ssize_t read(int fd, void *buf, size_t count);
int main()
{
int s_fd;
char readbuf[128];
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
memset(&s_addr,0,sizeof(struct sockaddr_in));
memset(&c_addr,0,sizeof(struct sockaddr_in));
s_fd = socket(AF_INET,SOCK_STREAM,0);
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(8666);
inet_aton("192.168.1.88",&s_addr.sin_addr);
bind(s_fd, (struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
listen(s_fd,10);
int clen = sizeof(struct sockaddr_in);
int c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
printf("get success,连接设备的IP为%s\n",inet_ntoa(s_addr.sin_addr));
write(c_fd,"hello i am linux",strlen("hello i am linux"));
read(c_fd,readbuf,sizeof(readbuf));
printf("content:%s\n",readbuf);
return 0;
}
就能实现双机通信操作
效果如下:
多方向服务器传送数据
服务端
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
//ssize_t read(int fd, void *buf, size_t count);
int main(int argc,char **argv)
{
int mark = 0;
int s_fd;
int c_fd;
if(argc!=3){
printf("value error");
exit(0);
}
char readbuf[128];
char writebuf[128];
char markbuf[128];
struct sockaddr_in s_addr;
struct sockaddr_in c_addr;
memset(&s_addr,0,sizeof(struct sockaddr_in));
memset(&c_addr,0,sizeof(struct sockaddr_in));
s_fd = socket(AF_INET,SOCK_STREAM,0);
s_addr.sin_family = AF_INET;
s_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&s_addr.sin_addr);
bind(s_fd, (struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
listen(s_fd,10);
int clen = sizeof(struct sockaddr_in);
while(1){
c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&clen);
mark++;
printf("get success,连接设备的IP为%s\n",inet_ntoa(s_addr.sin_addr));
if(fork()==0){
if(fork()==0){
while(1){
sprintf(markbuf,"client %d connect!",mark);
write(c_fd,markbuf,strlen(markbuf));
sleep(10);
}
}
while(1){
memset(readbuf,0,sizeof(readbuf));
read(c_fd,readbuf,sizeof(readbuf));
printf("%s\n",readbuf);
}
}
}
return 0;
}
~
客户端
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <unistd.h>
#include <stdlib.h>
//int connect(int sockfd, const struct sockaddr *addr,
// socklen_t addrlen);
int main(int argc,char **argv)
{
int c_fd;
char readbuf[128];
char writebuf[128];
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
c_fd = socket(AF_INET,SOCK_STREAM,0);
c_addr.sin_family = AF_INET;
c_addr.sin_port = htons(atoi(argv[2]));
inet_aton(argv[1],&c_addr.sin_addr);
connect(c_fd,(struct sockaddr *)&c_addr,sizeof(struct sockaddr_in));
printf("get success,连接设备的IP为%s\n",inet_ntoa(c_addr.sin_addr));
while(1){
if(fork()==0){
while(1){
memset(readbuf,0,sizeof(readbuf));
read(c_fd,readbuf,sizeof(readbuf));
printf("%s\n",readbuf);}
}
while(1){
memset(writebuf,0,sizeof(readbuf));
printf("input:");
scanf("%s",writebuf);
write(c_fd,writebuf,strlen(writebuf));
}
}
return 0;
}
可以与多台设备连接
效果如下: