linux下TCP连接的client和server
http://blog.163.com/caipeipei_love@126/blog/static/2596603220101118433940/
基于TCP连接的client和server简单通信
我在看电子书,班主任来了说动手写个client和server的简单通信,只看是不行的,写好了给我看看,真的是一语点中了真理啊:只看不动手,什么时候都不会掌握的!
下午自己就动手写了一个:
主要是基于TCP的三次握手的,面向连接的client和server
tcpserver.c
#include<stdlib.h> #include<stdio.h> #include<errno.h> #include<string.h> #include<netdb.h> #include<sys/types.h> #include<netinet/in.h> #include<sys/socket.h> #include<unistd.h> #include<arpa/inet.h> #define portnumber 8080 int main(int argc ,char *argv[]) { int sockfd,new_fd; struct sockaddr_in server_addr; struct sockaddr_in client_addr; int sin_size,iDataNum; // const char hello[]="Hello cpp, you are success. "; char buffer[4096];</span><span style="color: #0000ff;">if</span>(argc!=<span style="color: #800080;">2</span><span style="color: #000000;">) { fprintf(stderr,</span><span style="color: #800000;">"</span><span style="color: #800000;">Usage:%s portnumbera </span><span style="color: #800000;">"</span>,argv[<span style="color: #800080;">0</span><span style="color: #000000;">]); </span><span style="color: #0000ff;">return</span> <span style="color: #800080;">0</span><span style="color: #000000;">; }// if((portnumber=atoi(argv[1]))<0)
// {
// fprintf(stderr,"Usage:%s portnumbera ",argv[0]);
// return 0;
// }
if((sockfd=socket(AF_INET,SOCK_STREAM,0))-1)
{
fprintf(stderr,"Socket error:%s a",strerror(errno));
return 0;
}
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=htonl(INADDR_ANY);
server_addr.sin_port=htons(portnumber);
if(bind(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))-1)
{
fprintf(stderr,"Bind error:%s a",strerror(errno));
return 0;
}
if(listen(sockfd,5)-1)
{
fprintf(stderr,"Listen error:%s a",strerror(errno));
return 0;
}
while(1)
{
sin_size=sizeof(struct sockaddr_in);
if((new_fd=accept(sockfd,(struct sockaddr *)(&client_addr),&sin_size))-1)
{
fprintf(stderr,"Accept error:%s a",strerror(errno));
return 0;
}
fprintf(stdout,"Server get connection from %s ",inet_ntoa(client_addr.sin_addr));
iDataNum=recv(new_fd,buffer,4096,0);
if(iDataNum<0)
{
perror("Recv ");
exit(1);
}
printf("Recv data is %s ",buffer);
send(new_fd,buffer,sizeof(buffer),0);
// if(write(new_fd,hello,strlen(hello))==-1)
// {
// fprintf(stderr,"write error:%s ",strerror(errno));
// return 0;
// }
close(new_fd);} close(sockfd);// exit(0);
return 0;
}
client.c
#include<stdlib.h> #include<stdio.h> #include<string.h> #include<netdb.h> #include<sys/types.h> #include<netinet/in.h> #include<sys/socket.h> #include<unistd.h> #include<arpa/inet.h> #include<errno.h>int main(int argc,char *argv[])
{
int sockfd;
char sendbuffer[200];
char recvbuffer[200];
// char buffer[1024];
struct sockaddr_in server_addr;
struct hostent host;
int portnumber,nbytes;
if(argc!=3)
{
fprintf(stderr,"Usage :%s hostname portnumbera ",argv[0]);
exit(1);
}
if((host=gethostbyname(argv[1]))NULL)
{
herror("Get host name error ");
exit(1);
}
if((portnumber=atoi(argv[2]))<0)
{
fprintf(stderr,"Usage:%s hostname portnumbera ",argv[0]);
exit(1);
}
if((sockfd=socket(AF_INET,SOCK_STREAM,0))-1)
{
fprintf(stderr,"Socket Error:%sa ",strerror(errno));
exit(1);
}
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_port=htons(portnumber);
server_addr.sin_addr=((struct in_addr *)host->h_addr);
if(connect(sockfd,(struct sockaddr *)(&server_addr),sizeof(struct sockaddr))-1)
{
fprintf(stderr,"Connect error:%s ",strerror(errno));
exit(1);
}
while(1)
{
printf("Please input your word: ");
scanf("%s",sendbuffer);
printf(" ");
if(strcmp(sendbuffer,"quit")0)
break;
send(sockfd,sendbuffer,sizeof(sendbuffer),0);
recv(sockfd,recvbuffer,200,0);
printf("recv data of my world is :%s ",recvbuffer);
}
// if((nbytes=read(sockfd,buffer,1024))==-1)
//{
// fprintf(stderr,"read error:%s ",strerror(errno));
// exit(1);
// }
// buffer[nbytes]=' ';
// printf("I have received %s ",buffer);
close(sockfd);
exit(0);
}
首先要编译tcpserver.c,命令:gcc -g tcpserver.c -o tcpserver
运行:./tcpserver 8080
然后再编译tcpclient.c,具体命令:gcc -g tcpclient.c -o tcpclient
运行:./tcpclient localhost 8080
[20181130]control file sequential read.txt
[20181124]关于降序索引问题3.txt
[20181124]关于降序索引问题2.txt
[20181122]模拟ORA-08103错误.txt
[20181116]18c DML 日志优化.txt
[20181109]12c sqlplus rowprefetch参数5
[20181109]12cR2 的pre_page_sga参数
[20181108]12c sqlplus rowfetch参数4.txt
ubuntu15.10 给解压版的eclipse安装桌面快捷方式
- 最新文章
-
汇编刷题:根据公式 Z=(X+Y)*8-X)/4 计算Z的结果(本题将结果放在AL寄存器里)
SpringBoot 错误处理页
SpringBoot 配置文件及其读取
并发编程的优缺点
消息队列 01
在ubuntu上安装maven
装饰者模式
工厂相关设计模式
软件设计的7大原则
UML
- 热门文章
-
TCP协议和UDP协议
8、spring注解学习(bean的生命周期)——让Bean实现InitializingBean,DisposableBean这两个接口进而实现初始和销毁方法
7、spring注解学习(bean的生命周期)——@Bean中通过initMethod和destroyMethod指定bean的初始化方法和销毁方法
6、spring注解学习(组件注册)——使用spring提供的FactoryBean(工厂bean)注入组件
5、spring注解学习(组件注册)——@Import快速给容器中导入组件
3、spring注解学习(组件注册)——@Scope注解设置组件作用域、@Lazy单例对象懒加载设置
2、spring注解学习(组件注册)——@ComponentScan自动扫描组件、指定扫描规则
1、spring注解学习(组件注册)——@Configuration、@Bean给容器中注册组件
1、ssm整合简单CRUD
[20181130]如何猜测那些值存在hash冲突.txt
