linux gcc下实现简单socket套接字小程序
2011-08-26 09:52
176 查看
服务端代码如下:
//服务端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <netdb.h>
//捕获子进程退出信号,在退出时给出提示
void sig_handler(int signo)
{
pid_t pid;
int stat;
pid=waitpid(-1,&stat,WNOHANG);
while(pid>0){
printf("子进程结束 (PID:%ld)\n",(long)getpid());
pid=waitpid(-1,&stat,WNOHANG);
}
}
int main(int argc,char *argv[])
{
socklen_t clt_addr_len;
int listen_fd;
int com_fd;
int ret;
int i;
static char recv_buf[1024];
int len;
int port;
pid_t pid;
struct sockaddr_in clt_addr;
struct sockaddr_in srv_addr;
//提示
if (argc!=2){
printf("exp: %s port\n",argv[0]);
return 1;
}
port=atoi(argv[1]);
//设置信号处理函数
if(signal(SIGCHLD,sig_handler)<0){
perror("cannot set the signal");
return 1;
}
//设置套接字监听
listen_fd=socket(PF_INET,SOCK_STREAM,0);
if(listen_fd<0){
perror("不能创建套接字监听!");
return 1;
}
memset(&srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
srv_addr.sin_port=htons(port);
ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret == -1){
perror("不能捆绑端口");
close(listen_fd);
return 1;
}
//监听指定端口,连接5个客户端
ret=listen(listen_fd,5);
if(ret==-1){
perror("不能监听端口");
close(listen_fd);
return 1;
}
while (1){
len=sizeof(clt_addr);
com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
if(com_fd<0){
if(errno == EINTR){
continue;
}else{
perror("不能返回结果");
close(listen_fd);
return 1;
}
}
pid=fork();//多进程
if(pid<0){
perror("不能创建子进程!");
close(listen_fd);
return 1;
}else if(pid == 0){
while((len=read(com_fd,recv_buf,1024))>0){
printf("连接端信息:(%d):%s\n",len,recv_buf);
if(recv_buf[0]=='@')
break;
for(i=0;i<len;i++)
recv_buf[i]=toupper(recv_buf[i]);
write(com_fd,recv_buf,len);
}
close(com_fd);
return 0;
}else
close(com_fd);
}
return 0;
}
客户端代码如下:
//客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netdb.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
int connect_fd;
int ret;
char snd_buf[1024];
int i;
int port;
int len;
static struct sockaddr_in srv_addr;
if(argc!=3){
printf("exp: %s server_ip port\n",argv[0]);
return 1;
}
port=atoi(argv[2]);
connect_fd=socket(PF_INET,SOCK_STREAM,0);
if(connect_fd<0){
perror("Cannot create communication socket");
return 1;
}
memset(&srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_addr.s_addr=inet_addr(argv[1]);
srv_addr.sin_port=htons(port);
//连接到服务器
ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret==-1){
perror("Cannot connect to the server");
close(connect_fd);
return 1;
}
memset(snd_buf,0,1024);
while(1){
write(STDOUT_FILENO,"In put some Message",14);
len=read(STDIN_FILENO,snd_buf,1024);
if(len>0)
write(connect_fd,snd_buf,len);
len=read(connect_fd,snd_buf,len);
if(len>0)
printf("The message from Server %s\n",snd_buf);
if(snd_buf[0] == '@')
break;
}
close(connect_fd);
return 0;
}
运行如下图:
代码来自《LINUX编程技术详解》。PS:Vim快把电脑的空格键用坏了,囧。
//服务端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <netdb.h>
//捕获子进程退出信号,在退出时给出提示
void sig_handler(int signo)
{
pid_t pid;
int stat;
pid=waitpid(-1,&stat,WNOHANG);
while(pid>0){
printf("子进程结束 (PID:%ld)\n",(long)getpid());
pid=waitpid(-1,&stat,WNOHANG);
}
}
int main(int argc,char *argv[])
{
socklen_t clt_addr_len;
int listen_fd;
int com_fd;
int ret;
int i;
static char recv_buf[1024];
int len;
int port;
pid_t pid;
struct sockaddr_in clt_addr;
struct sockaddr_in srv_addr;
//提示
if (argc!=2){
printf("exp: %s port\n",argv[0]);
return 1;
}
port=atoi(argv[1]);
//设置信号处理函数
if(signal(SIGCHLD,sig_handler)<0){
perror("cannot set the signal");
return 1;
}
//设置套接字监听
listen_fd=socket(PF_INET,SOCK_STREAM,0);
if(listen_fd<0){
perror("不能创建套接字监听!");
return 1;
}
memset(&srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);
srv_addr.sin_port=htons(port);
ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret == -1){
perror("不能捆绑端口");
close(listen_fd);
return 1;
}
//监听指定端口,连接5个客户端
ret=listen(listen_fd,5);
if(ret==-1){
perror("不能监听端口");
close(listen_fd);
return 1;
}
while (1){
len=sizeof(clt_addr);
com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);
if(com_fd<0){
if(errno == EINTR){
continue;
}else{
perror("不能返回结果");
close(listen_fd);
return 1;
}
}
pid=fork();//多进程
if(pid<0){
perror("不能创建子进程!");
close(listen_fd);
return 1;
}else if(pid == 0){
while((len=read(com_fd,recv_buf,1024))>0){
printf("连接端信息:(%d):%s\n",len,recv_buf);
if(recv_buf[0]=='@')
break;
for(i=0;i<len;i++)
recv_buf[i]=toupper(recv_buf[i]);
write(com_fd,recv_buf,len);
}
close(com_fd);
return 0;
}else
close(com_fd);
}
return 0;
}
客户端代码如下:
//客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <netdb.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
int connect_fd;
int ret;
char snd_buf[1024];
int i;
int port;
int len;
static struct sockaddr_in srv_addr;
if(argc!=3){
printf("exp: %s server_ip port\n",argv[0]);
return 1;
}
port=atoi(argv[2]);
connect_fd=socket(PF_INET,SOCK_STREAM,0);
if(connect_fd<0){
perror("Cannot create communication socket");
return 1;
}
memset(&srv_addr,0,sizeof(srv_addr));
srv_addr.sin_family=AF_INET;
srv_addr.sin_addr.s_addr=inet_addr(argv[1]);
srv_addr.sin_port=htons(port);
//连接到服务器
ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));
if(ret==-1){
perror("Cannot connect to the server");
close(connect_fd);
return 1;
}
memset(snd_buf,0,1024);
while(1){
write(STDOUT_FILENO,"In put some Message",14);
len=read(STDIN_FILENO,snd_buf,1024);
if(len>0)
write(connect_fd,snd_buf,len);
len=read(connect_fd,snd_buf,len);
if(len>0)
printf("The message from Server %s\n",snd_buf);
if(snd_buf[0] == '@')
break;
}
close(connect_fd);
return 0;
}
运行如下图:
代码来自《LINUX编程技术详解》。PS:Vim快把电脑的空格键用坏了,囧。
相关文章推荐
- 套接字(socket)编程简单实现server-client聊天程序
- 【java学习记录】12.用Socket网络访问方法,实现简单的网络聊天程序
- 002.ICMP--拼接ICMP包,实现简单Ping程序(原始套接字)
- java-用java.net.Socket和java.net.ServerSocket实现简单的聊天程序
- 最简单的实现TCP通信,利用Socket和ServerSocket套接字
- Netty学习笔记14 使用Netty-SocketIO 实现简单聊天室程序
- c#基于socket编程实现简单多人聊天程序
- 学习 UNIX网络编程卷1:套接字 笔记1-实现一个简单的回射客户服务器程序
- Socket编程实践(3) 多连接服务器实现与简单P2P聊天程序例程
- Java 利用套接字Socket实现简单的服务器与客户端通信
- 利用原始socket简单实现FTP的客户端和服务器端程序
- 通过php socket并借助telnet实现简单的聊天程序
- socket 实现的简单的p2p服务程序
- Java 利用套接字Socket实现简单的服务器与客户端通信
- 解析:通过php socket并借助telnet实现简单的聊天程序
- java用socket和serversocket实现一对一聊天(java实现简单的TCP聊天程序)
- java简单Socket聊天室程序的实现
- python实现简单socket程序在两台电脑之间传输消息的方法
- 运用Java中socket编程实现简单的服务器客户端收发信息程序
- java swing实现简单的socket通讯聊天程序源码