基于socket的网络编程(实现服务器与客户端的互发消息)
服务器API解析
Socket() 申请一个套接字接口
Bind()为套接字添加信息(ip地址和端口号)
Listen()监听网络连接
Accept()监听到有客户端接入,接受一个连接
Read()读取数据
Write()发送数据
Close()关闭套接字,断开连接
客户端API解析
Socket() 申请一个套接字接口
connect()连接到服务器
Read()读取数据
Write()发送数据
Close()关闭套接字,断开连接
服务器代码
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include<stdlib.h>
#include<string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <pthread.h>
#include <unistd.h>
int cfd;
void *fun(void *ftr)
{
char writeBuf[128]={'\0'};
char readBuf[128]={'\0'};
int nread;
int pid;
while(1)
{
pid=fork();
if(pid==0)
{
memset(readBuf,0,sizeof(readBuf));
nread=read(cfd,readBuf,sizeof(readBuf));
if(nread>0)
{
printf("get client msg: %s\n",readBuf);
}
}
if(pid>0)
{
memset(writeBuf,0,sizeof(readBuf));
printf("Input:");
scanf("%s",writeBuf);
write(cfd,writeBuf,sizeof(writeBuf));
}
}
}
int main(int argc,char **argv)
{
int sfd;
int len;
pthread_t t1;
struct sockaddr_in caddr;
struct sockaddr_in addr;
memset(&addr,0,sizeof(struct sockaddr_in));
memset(&caddr,0,sizeof(struct sockaddr_in));
sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd==-1)
{
printf("create socket fail\n");
perror("socket");
}
addr.sin_family=AF_INET;
addr.sin_port=htons(atoi(argv[2]));
inet_aton(argv[1],&addr.sin_addr);
bind(sfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));
listen(sfd,10);
len=sizeof(struct sockaddr_in);
while(1)
{
cfd=accept(sfd,(struct sockaddr *)&caddr,&len);
printf("get ip:%s\n",inet_ntoa(caddr.sin_addr));
pthread_create(&t1,NULL,fun,NULL);
}
close(sfd);
close(cfd);
return 0;
}
客户端代码
#include<stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include<stdlib.h>
#include<string.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <pthread.h>
#include <unistd.h>
int sfd;
void *fun(void *ftr)
{
char writeBuf[128]={'\0'};
char readBuf[128]={'\0'};
int nread;
int pid;
while(1)
{
pid=fork();
if(pid==0)
{
memset(writeBuf,0,sizeof(writeBuf));
printf("Input:");
scanf("%s",writeBuf);
write(sfd,writeBuf,sizeof(writeBuf));
}
if(pid>0)
{
memset(readBuf,0,sizeof(writeBuf));
nread=read(sfd,readBuf,sizeof(readBuf));
if(nread>0)
{
printf("get server msg:%s\n",readBuf);
}
}
}
}
int main(int argc,char **argv)
{
pthread_t t1;
struct sockaddr_in addr;
memset(&addr,0,sizeof(struct sockaddr_in));
sfd=socket(AF_INET,SOCK_STREAM,0);
if(sfd==-1)
{
printf("create socket fail\n");
perror("socket");
}
addr.sin_family=AF_INET;
addr.sin_port=htons(atoi(argv[2]));
inet_aton(argv[1],&addr.sin_addr);
connect(sfd,(struct sockaddr *)&addr,sizeof(struct sockaddr_in));
pthread_create(&t1,NULL,fun,NULL);
pthread_join(t1,NULL);
close(sfd);
return 0;
}