一.客户端
所谓socket套接字 按照我的理解就算是GPS定位 主要通过(IP+端口) 来指定地点,在客户端而言,指定服务器的ip地址和端口就能指定唯一的那台服务器
connect成功之后,就能与服务器全双工地收发信息 分别调用 read 和 write 去收发,要注意read也是阻塞性的函数
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <string.h>
#define serverip "192.168.157.134"
#define serverport 6677
int main(int argc,char* argv[]){
char buff[64]="wo ai ni!";
char * str1="Do you like C++?";
char * str2="Why do you like C++?";
char * str3="Me too";
int client_sock=socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in client_addr;
bzero(&client_addr,sizeof(client_addr));
client_addr.sin_family=AF_INET;
inet_pton(AF_INET,serverip,&client_addr.sin_addr);
client_addr.sin_port=htons(serverport);
connect(client_sock,(struct sockaddr*) &client_addr,sizeof(client_addr));
int len=write(client_sock,str1,strlen(str1));
perror("write:");
fflush(stdout);
while(1){
len= read(client_sock,buff,sizeof(buff)-1);
if(len>0){
buff[len]='\0';
printf("%s\n",buff);
fflush(stdout);
if(strcmp(buff,"Yes.I do")==0){
write(client_sock,str2,strlen(str2));
}
}else if(len==0){
printf("disconnect\n");
fflush(stdout);
client_sock=socket(AF_INET,SOCK_STREAM,0);
connect(client_sock,(struct sockaddr*) &client_addr,sizeof(client_addr));
write(client_sock,str3,strlen(str3));
break;
}
}
close(client_sock);
return 0;
}
二.服务器端
与客户端不同的是 ,服务器端需要一个绑定的"接口"收取来自四面八方的客户端连接请求,所以这个需要bind的socket是固定的,静止的. 通俗意义上来讲就相当于一个收件箱 你只需要负责绑定从服务器的哪个端口进,还有允许哪些ip访问就行,我这里的INADDR_ANY相当于0.0.0.0,就是任何人都能访问.然后每当有新的连接进来,分别创立一个socket与之通信就行了.
很多人不理解socket到底是什么,其实本质意义上他是一个int类型的数,是操作系统分配给你的一个数字,相当于唯一的标识符,你只需要通过这个数字去进行网络编程,不需要你涉及具体的TCP/IP协议,操作系统内核会帮你处理这些细节,你只需要用这个数字 去进行网络编程就行了,让网络编程变得简单很多.
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <ctype.h>
#include <arpa/inet.h>
#define SERVER_PORT 6677
int main(int argc,char* argv[]){
int server_sock= socket(AF_INET,SOCK_STREAM,0);
struct sockaddr_in server_addr;
bzero(&server_addr,sizeof(server_addr));
char content[64];
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(SERVER_PORT);
bind(server_sock,(struct sockaddr*)&server_addr,sizeof(server_addr));
listen(server_sock,128);
printf(" 正在listen\n");
char * str1="Yes.I do";
char * str2="Because i can use it to write programs.";
char * str3="And you?";
while(1){
struct sockaddr_in client_addr;
int client_sock;
char buff[64];
int client_length=sizeof(client_addr);
printf("waiting new connect!\n");
client_sock=accept(server_sock,(struct sockaddr*)&client_addr,&client_length);
printf("client ip:%s\t port:%d\n ",inet_ntop(AF_INET,&client_addr.sin_addr.s_addr,buff,sizeof(buff)),ntohs(client_addr.sin_port));
while(1){
int size=read(client_sock,content,sizeof(content)-1);
content[size]='\0';
if(!strcmp(content,"Do you like C++?")){
content[size]='\0';
printf("%s\n",content);
fflush(stdout);
write(client_sock,str1,strlen(str1));
}else if(!strcmp(content,"Why do you like C++?")){
content[size]='\0';
printf("%s\n",content);
fflush(stdout);
write(client_sock,str2,strlen(str2));
write(client_sock,str3,strlen(str3));
close(client_sock);
break;
}else {
content[size]='\0';
printf("%s\n",content);
fflush(stdout);
break;
}
}
}
return 0;
}
三.功能
这个例子主要功能就是双方的一个相互通信的例子,在什么时候发送什么句子,并且双方都是全双工通信.