net.h
ifndef _NET_H_
#define _NET_H_
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <errno.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <signal.h>
#define SERV_PORT 5001
#define SERV_IP_ADDR "192.168.28.184"
#define QUIT_STR "quit"
#endif
基于多进程的
代码示例
addr_in sin;
//1.创建套接字
fd = socket(AF_INET,SOCK_STREAM,0);
if(fd<0){
perror("socket");
exit(1);
}
//2.绑定
//2.1填充结构体
bzero(&sin,sizeof(sin));
sin.sin_port = htons(SERV_PORT);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl (INADDY_ANY);
int ret = -1;
ret = bind(fd,(struct sockaddr *)&sin,sizeof(sin));
if(ret<0){
perror("bind");
exit(1);
}
//3.listen
listen(fd,5);
//4.accept
int newfd = -1;
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
pthread_t tid;
while(1){
newfd = accept(fd,(struct sockaddr *)&cin,&addrlen);
if(newfd<0){
perror("accept");
break;
}
char ipv4_addr[16];
if(!inet_ntop(AF_INET,(void *)&cin.sin_addr,ipv4_addr,sizeof(sin))){
perror("inet_pton");
break;
}
printf("client(%s,%d) is connected\n",ipv4_addr,ntohs(cin.sin_port));
//5.多线程进行读写
pthread_create(&tid,NULL,cli_handle,&newfd);
}
close(fd);
return 0;
}
void * cli_handle(void * arg){
int newfd = *(int *)arg;
printf("client newfd = %d\n",newfd);
int ret = -1;
char buf[BUFSIZ];
bzero(buf,BUFSIZ);
while(1){
do{
ret = read(newfd,buf,BUFSIZ-1);
}while(ret<0&&EINTR==errno);
if(ret<0){
break;
}
printf("recive data = %s\n",buf);
if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){
printf("clinet %d is exiting\n",newfd);
break;
}
}
close(newfd);
}
#include "net.h"
int main(int argc, char *argv[])
{
if(argc!=3){
printf ("\n%s serv_ip serv_port", argv[0]);
printf ("\n\t serv_ip: serv_iper ip address");
printf ("\n\t serv_port: server port(>5000)\n\n");
return 0;
}
int fd = -1;
int port = -1;
port = atoi(argv[2]);
struct sockaddr_in sin;
//1.创建套接字
fd = socket(AF_INET,SOCK_STREAM,0);
if(fd<0){
perror("socket");
exit(1);
}
//2.绑定
//2.1填充结构体
bzero(&sin,sizeof(sin));
sin.sin_port = htons(SERV_PORT);
sin.sin_family = AF_INET;
//sin.sin_addr.s_addr = inet_addr(SERV_IP_ADDR);
if(inet_pton(AF_INET,argv[1],(void *)&sin.sin_addr)!=1){
perror("inet_pton");
exit(1);
}
int ret = -1;
ret = connect(fd,(struct sockaddr *)&sin,sizeof(sin));
if(ret<0){
perror("connect");
exit(1);
}
printf("client connect success\n");
char buf[BUFSIZ];
while(1){
bzero(buf,BUFSIZ);
if(fgets(buf,BUFSIZ-1,stdin)==NULL){
continue;
}
do{
write(fd,buf,strlen(buf));
}while(ret<0&&EINTR==errno);
if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){
printf("client exit\n");
break;
}
}
close(fd);
return 0;
}
基于多进程的
代码示例
#include "net.h"
void * cli_handle(void *arg);
void sig_handle(int sig){
if(sig==SIGCHLD){
wait(-1,NULL,WNOHANG);
}
}
int main(int argc, char *argv[])
{
int fd;
struct sockaddr_in sin;
signal(SIGCHLD,sig_handle);
//1.创建套接字
fd = socket(AF_INET,SOCK_STREAM,0);
if(fd<0){
perror("socket");
exit(1);
}
//2.绑定
//2.1填充结构体
bzero(&sin,sizeof(sin));
sin.sin_port = htons(SERV_PORT);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(SERV_IP_ADDR);
int ret = -1;
ret = bind(fd,(struct sockaddr *)&sin,sizeof(sin));
if(ret<0){
perror("bind");
exit(1);
}
//3.listen
listen(fd,5);
//4.accept
int newfd = -1;
struct sockaddr_in cin;
socklen_t addrlen = sizeof(cin);
while(1){
pid_t pid = -1;
newfd = accept(fd,(struct sockaddr *)&cin,&addrlen);
if(newfd<0){
perror("accept");
break;
}
pid = fork();
if(pid<0){
perror("fork");
break;
}else if(pid == 0){
close(fd);
char ipv4_addr[16];
if(!inet_ntop(AF_INET,(void *)&cin.sin_addr,ipv4_addr,sizeof(sin))){
perror("inet_pton");
break;
}
printf("client(%s,%d) is connected\n",ipv4_addr,ntohs(sin.sin_port));
cli_handle(&newfd);
return 0;
}else{
close(newfd);
}
}
close(fd);
return 0;
}
void * cli_handle(void * arg){
int newfd = *(int *)arg;
printf("client newfd = %d\n",newfd);
int ret = -1;
char buf[BUFSIZ];
bzero(buf,BUFSIZ);
while(1){
do{
ret = read(newfd,buf,BUFSIZ-1);
}while(ret<0&&EINTR==errno);
if(ret<0){
exit(1);
}
printf("recive data = %s\n",buf);
if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){
printf("clinet %d is exiting\n",newfd);
break;
}
}
close(newfd);
}
#include "net.h"
int main(int argc, char *argv[])
{
int fd;
struct sockaddr_in sin;
//1.创建套接字
fd = socket(AF_INET,SOCK_STREAM,0);
if(fd<0){
perror("socket");
exit(1);
}
//2.绑定
//2.1填充结构体
bzero(&sin,sizeof(sin));
sin.sin_port = htons(SERV_PORT);
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = inet_addr(SERV_IP_ADDR);
int ret = -1;
ret = connect(fd,(struct sockaddr *)&sin,sizeof(sin));
if(ret<0){
perror("connect");
exit(1);
}
printf("client connect success\n");
char buf[BUFSIZ];
while(1){
bzero(buf,BUFSIZ);
if(fgets(buf,BUFSIZ-1,stdin)==NULL){
continue;
}
do{
write(fd,buf,strlen(buf));
}while(ret<0&&EINTR==errno);
if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))){
printf("client exit\n");
break;
}
}
close(fd);
return 0;
}