网络编程的服务端和客户端实战的基本实现
1.编写服务端和客户端基本流程图
2. 服务端代码实现和解析
1)服务端的流程
代码实现一般分为六个流程
1 socket,套接字
我们要创建套接字,为套接字添加信息
socket()
我们一般使用的AF_INET IPV4因特网域,在国内一般是使用AF_INET,TYPE参数一般也是使用TCP协议的SOCK_STREAM
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);
地址转换API
int inet_aton(const char* straddr,struct in_addr *addrp);
把字符串形式的“192.168.1.123”转为网络能识别的格式
char* inet_ntoa(struct in_addr inaddr);
把网络格式的ip地址转为字符串形式
2 bind
我们一般使用是的 struct sockaddr_in 所以在bind()函数里,我们要强转成struct sockaddr
bind(s_fd,(struct sockaddr *)&s_addr,sizeof(struct sockaddr_in));
3 linsten
4 accept
5 read
6 write
服务器的代码
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char **argv)
{
// 1 socket
printf("aaa");
socklen_t s_fd;
int c_fd;
int size;
int n_read;
char readBuff[128] = {0};
// char *servemsg = "I recieve\n";
char servemsg[128] = {0};
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);
if(s_fd == -1){
perror("socket");
exit(-1);
}
// 2 bind
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));
// 3 listen
listen(s_fd,10);
// 4 accept
while(1){
size = sizeof(struct sockaddr_in);
c_fd = accept(s_fd,(struct sockaddr *)&c_addr,&size);
if(c_fd == -1){
perror("accpect");
}
printf("get connect %s\n",inet_ntoa(c_addr.sin_addr));
// 5 read
if(fork() == 0){
if(fork() == 0){
while(1){
memset(servemsg,0,128);
printf("input\n");
gets(servemsg);
write(c_fd,servemsg,strlen(servemsg));
}
}
while(1){
memset(readBuff,0,128);
n_read = read(c_fd,readBuff,128);
if(n_read == -1){
perror("read");
}else{
printf("get msg:%d,%s\n",n_read,readBuff);
}
}
}
// 6 write
}
// while(1);
return 0;
}
3 客户端代码
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
//#include <linux/in.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <string.h>
int main(int argc,char **argv)
{
// 1 socket
int c_fd;
int size;
int n_read;
char readBuff[128] = {0};
char *clientmsg = "msg from client\n";
struct sockaddr_in c_addr;
memset(&c_addr,0,sizeof(struct sockaddr_in));
c_fd = socket(AF_INET,SOCK_STREAM,0);
if(c_fd == -1){
perror("socket");
exit(-1);
}
// 2 bind
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));
// 5 read
write(c_fd,clientmsg,strlen(clientmsg));
n_read = read(c_fd,readBuff,128);
if(n_read == -1){
perror("read");
}else{
printf("get msg from serve:%d,%s",n_read,readBuff);
}
// 6 write
return 0;
}