(2014.4.29)server/client代码
来源:互联网 发布:淘宝买家怎么升级 编辑:程序博客网 时间:2024/06/06 06:52
先运行server:
#include<sys/socket.h>
#include<fcntl.h>
#include<netinet/in.h>
#include<netinet/tcp.h>
#include"string.h"
#include"stdlib.h"
#include"stdio.h"
#include<pthread.h>
#include<sys/epoll.h>
#define SOCKET_SND_BUF_SIZE (1024*1024)
#define SOCKET_RCV_BUF_SIZE (1024*1024)
void INFO(const char *s){
printf("%s\n",s);
}
int create_listen_sockfd(int &fd,int port,int max_conn){
//create socket
fd=socket(PF_INET,SOCK_STREAM,0);
if(fd==-1){
INFO("err:create socket");
return -1;
}else{
INFO("succeed:create socket");
}
//setsockopt
int options;
options = SOCKET_SND_BUF_SIZE;
setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &options, sizeof(int));
options = SOCKET_RCV_BUF_SIZE;
setsockopt(fd, SOL_SOCKET, SO_RCVBUF, &options, sizeof(int));
options = 1;
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &options, sizeof(int));
options = fcntl(fd, F_GETFL);
fcntl(fd, F_SETFL, options | O_NONBLOCK);
int on = 1;
int ret;
ret = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, (char *)&on, sizeof(on));
if(ret==-1){
INFO("err:setsocketopt");
return -1;
}else{
INFO("succeed:setsocketopt");
}
//bind
sockaddr_in addr;
memset(&addr,0,sizeof addr);
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=INADDR_ANY;
addr.sin_port=htons(port);
ret=bind(fd,(const sockaddr*)&addr,sizeof addr);
if(ret==-1){
INFO("err:bind");
return -1;
}else{
INFO("succeed:bind");
}
//listen
ret=listen(fd,max_conn);
if(ret==-1){
INFO("err:listen");
return -1;
}else{
INFO("succeed:listen");
}
return 0;
}
int add_fd_into_epfd(int &epfd,int &fd){
epoll_event event;
event.events=EPOLLIN|EPOLLET;
event.data.fd=fd;
int ret=epoll_ctl(epfd,EPOLL_CTL_ADD,fd,&event);
if(ret<0){
INFO("err:epoll ctl");
return -1;
}
return 0;
}
int rm_fd_from_epfd(int &epfd,int &fd){
epoll_event event;
event.events=EPOLLIN|EPOLLET;
event.data.fd=fd;
int ret=epoll_ctl(epfd,EPOLL_CTL_DEL,fd,&event);
if(ret<0){
INFO("err:epoll ctl");
return -1;
}
return 0;
}
int recv_data(int fd){
char buf[4096];
char recv_buf[4096]="";
int offset=0;
int len=-1;
while((len=recv(fd,buf,sizeof(buf),0))>0){
printf("recv:%s\n",buf);
sprintf(recv_buf+offset,"%s",buf);
offset+=len;
memset(buf,0,strlen(buf));
}
if(len<0){
INFO("err:recv data");
return -1;
}else{
INFO("connect closed");
}
return 0;
}
int main(){
int max_conn=100;
int port=8012;
//create listen sockfd
int listen_fd;
int ret;
ret=create_listen_sockfd(listen_fd,port,max_conn);
if(ret==-1) return -1;
//epoll
int epfd;
epfd=epoll_create(max_conn);
if(epfd==-1){
INFO("err:create epoll fd");
return -1;
}
ret=add_fd_into_epfd(epfd,listen_fd);
if(ret==-1) return -1;
epoll_event *ready_events=new epoll_event[max_conn];
//svr
while(true){
int event_num=epoll_wait(epfd,ready_events,max_conn,-1);
//handler
printf("epoll wake up! ready_events:%d\n",event_num);
for(int i=0;i<event_num;++i){
int ready_fd=ready_events[i].data.fd;
if(ready_fd==listen_fd){
//accept
int recv_fd=accept(ready_fd,NULL,NULL);
if(recv_fd==-1){
INFO("err:accept");
return -1;
}else{
INFO("succeed:accept");
}
ret=add_fd_into_epfd(epfd,recv_fd);
if(ret==-1) return -1;
}else{
//recv data
ret=rm_fd_from_epfd(epfd,ready_fd);
if(ret==-1) return -1;
ret=recv_data(ready_fd);
if(ret==-1){
return -1;
}
printf("--------------------------------------------\n");
}
}
}
delete []ready_events;
return 0;
}
再运行client:
#include"stdio.h"
#include"stdlib.h"
#include<sys/socket.h>
#include<netinet/in.h>
#include<netinet/tcp.h>
#include<fcntl.h>
#include<string.h>
#include<arpa/inet.h>
#include<unistd.h>
#define SOCKET_SND_BUF_SIZE (1024*1024)
#define SOCKET_RCV_BUF_SIZE (1024*1024)
void INFO(const char *s){
printf("%s\n",s);
}
int main(int argc,char *argv[]){
//create socket
int fd=socket(PF_INET,SOCK_STREAM,0);
if(fd==-1){
INFO("err:create socket");
return -1;
}else{
INFO("create socket succeed");
}
//connect
int port=8012;
sockaddr_in addr;
memset(&addr,0,sizeof addr);
addr.sin_family=AF_INET;
addr.sin_addr.s_addr=inet_addr("10.134.89.204");
addr.sin_port=htons(port);
int ret=connect(fd,(struct sockaddr *)&addr,sizeof(struct sockaddr));
if(ret==-1){
INFO("err:building connect");
return -1;
}else{
INFO("building connect succeed");
}
//send data
char buf[4096];
char s[4096];
while(true){
printf("sending: ");
scanf("%s",s);
if(strcmp(s,"over")==0) break;
sprintf(buf,s);
int len=send(fd,buf,strlen(buf),0);
if(len<0){
INFO("err:send data");
return -1;
}else{
//printf("succeed! sending data:'%s',bytes:%d\n",buf,len);
}
}
return 0;
}
运行结果:
client:
server:
- (2014.4.29)server/client代码
- (2014.4.24)server/client代码
- UDP server,client 代码
- java client访问https server(客户端代码、服务器端配置)
- WebService的server与client代码
- 使用zend studio + xdebug调试php代码(iOS client + php server)
- Client/Server
- server&&client
- client server
- 代码客:G-Socket(IOCP) 1.0(Server/Client)例程源码+Server体验程序+强大的压力测试工具
- ZooKeeper Server/Client Session 设计及代码分析
- linux c socket client与server实例代码
- Java Socket Server-client端多线程处理代码示例
- 经典 C语言 socket SERVER,CLIENT 端代码实现
- Client代码
- CVS Client/Server连接设置(转)
- tftp(client、server)配置详解
- server client (开源中国)
- UVa1602 - Lattice Animals
- 【转载】Linux下用dd命令扇区读写SD卡
- 遇到WARNING:Could not lower the asynch I/O limit to 170 for SQL direct I/O. It is set to -1
- 大量数据的情况下,找出最热门的TOP N 词汇
- 让生活过得更像生活,活泼的屌丝。
- (2014.4.29)server/client代码
- TextView代码设置一个TopDrawable
- 第一届省赛 Phone Number
- oracle数据库死锁解决方法
- Android Studio--Gradle脚本初识
- AC自动机学习记录
- mysql不能备份
- Openwrt 3G拨号上网
- 一小时搭建个人网站