UNIX Socket编程

客户端程序设计 :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#define rec_length 20
main(int argc,char **argv)
{
struct hostent *hp;
struct sockaddr_in sin;
struct servent sp;
char buf[50];
int s,pid;
char service,dest;
if(argc!=1){
service=argv[1];
dest=argv[2];}
else {
fprintf(stderr,“NO service assigned!\nUsage:”);
fprintf(stderr,"%s service_name destination!\n",argv[0]);
fprintf(stderr,“Note: service_name is defined in /etc/services\n”);
fprintf(stderr," destination is defined in /etc/hosts\n");
exit(-1);
}
if((sp=getservbyname(service,“tcp”))NULL){
fprintf(stderr,“Error: getservbyname”);
exit(-5);
}
if((hp=gethostbyname(dest))0)
{ fprintf(stderr,“Error: gethostbyname”);
exit(-6);
}
bzero(&sin,sizeof(sin));
bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);
sin.sin_family=hp->h_addrtype;
sin.sin_port=sp->s_port;
if((s=socket(AF_INET,SOCK_STREAM,0))
-1){
fprintf(stderr,“Error: socket”);
exit(-6);
}
if(connect(s,&sin,sizeof(sin))
-1){
fprintf(stderr,“Error: connect”);
close(s);
exit(-6);
}
// next 2 Line build request message
pid=getpid();
sprintf(buf,"%5.5d%5.5d%5.5d%5.5d\n",pid,pid
2,pid
3,pid
4);
fprintf(stderr,"%s is sending request message: %s\n",argv[0],buf);
if(write(s,buf,rec_length)!=rec_length){ //to server
fprintf(stderr,“Write Socket s ERROR\n!”);
close(s);
exit(-1);
}
if(read(s,buf,rec_length)==0){ //get replay from server
fprintf(stderr,“Read Socket s Error\n”);
close(s); exit(-2);
}
printf("%s get reply: %s\n",argv[0],buf);
close(s);
exit(0);
}

服务器程序设计:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#define rec_length 20
main(int argc, char **argv )
{
struct sockaddr_in sin;
struct servent *sp;
int s,ns,pid;
char buf[50];
char *service;
if(argc!=1) service=argv[1];
else {
fprintf(stderr,“NO service assigned!\nUsage:\n”);
fprintf(stderr,"\t%s server_name!\n",argv[0]);
fprintf(stderr,“Note: server_name is defined in file /etc/services\n”);
exit(-1);
}
if((sp=getservbyname(service,“tcp”))NULL){
fprintf(stderr,“Error: getservbyname”);
exit(-5);
}
if((s=socket(AF_INET,SOCK_STREAM,0))
-1){
fprintf(stderr,“Error: socket create”);
exit(-6);
}
bzero(&sin,sizeof(sin));
sin.sin_port=sp->s_port;
if(bind(s,&sin,sizeof(sin))-1){
fprintf(stderr,“Error: bind”);
close(s);
exit(-6);
}
if(listen(s,5)
-1){
fprintf(stderr,“Error: listen”);
close(s);
exit(-6);
}
while(1){
fprintf(stderr,"\n\t\t\t Now wait connect …\n");
if((ns=accept(s,0,0))-1){ // wait a connection */
fprintf(stderr,“error: accept”);
continue;
}
if((pid=fork())
-1){ // conneted, and then create child proc
fprintf(stderr,“server: fork error!”);
close(s);
exit(-1);
}
if(pid!=0){ //parent proce, nothing to do, and to the next loop
close(ns);
wait(0);
continue;
}
if(pid==0){ // entered child proccedure
close(s);
printf(“Receive a client connect:%s\n”,argv[1]);
if(read(ns,buf,rec_length)==0){
fprintf(stderr,“Read nothing from socket:ns\n”);
close(ns);
exit(-3);
}
printf("%s get message from ns: %s\n",argv[0],buf); // request message got from the Client.
// I may do some Server work here.
// I can also ask another server serve me from a different Socket
// Because I am a demo Server, I will not do that.
// Next 2 Line, build a replay Message buf, and write it back
pid=getpid();

sprintf(buf,"%5.5d%5.5d%5.5d%5.5d\n",pid,pid2,pid3,pid*4);
fprintf(stderr,“And, %s replay to client: %s\n”,argv[0],buf);
if(write(ns,buf,rec_length)!=rec_length){
fprintf(stderr,“Write socket ns error!\n”);
close(ns);
exit(-4);
}
close(ns);
exit(0);
}
}
}
 要在/etc/services里添加
要在/etc/services里添加
在这里插入图片描述
然后运行服务器端10-2为刚添加的server_name 等待连接
在这里插入图片描述
在这里插入图片描述

开两个终端,客户端两个参数server_name 和host_name
/etc/hosts
/etc/hosts

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值