socket相关知识:
socket相关基础知识:http://www.cnblogs.com/skynet/archive/2010/12/12/1903949.html
非阻塞socket:http://blog.csdn.net/hanchaoman/article/details/4841112
本地进程通信:http://blog.csdn.net/xnwyd/article/details/7359506
实例:
tcp协议通信
1. 服务器端
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
#include<string.h>
#include<sys/types.h>
#include<netinet/in.h>
#include<sys/socket.h>
#include<sys/wait.h>
#define SERVPORT 3333//设置端口号
#define BACKLOG 10
void main()
{
int sockfd,client_fd,opt;
struct sockaddr_in my_addr;
struct sockaddr_in remote_addr;
int sin_size;
FILE *fd;
char buf[1024];
int len;
int num=0;
if((sockfd=socket(AF_INET, SOCK_STREAM, 0))==-1)//创建套接字
perror("create socket failed!\n");
else
printf("create socket successfully!\n");
setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt));//设置可以重复使用
my_addr.sin_family = AF_INET;//套接字配置相关选项
my_addr.sin_port = htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if(bind(sockfd, (struct sockaddr*)&my_addr, sizeof(struct sockaddr))==-1)//绑定操作
{
perror("failed bind the port\n");
exit(1);
} else {
printf("bind successfully\n");
}
if(listen(sockfd, BACKLOG)==-1)//置监听模式
{
perror("listen failed\n");
exit(1);
}else
printf("listen successfully\n");
sin_size=sizeof(struct sockaddr_in);
if((client_fd=accept(sockfd,(struct sockaddr*)&remote_addr,&sin_size))==-1){//等待接受消息
perror("accept failed\n");
}else
printf("accept successfully\n");
fd=fopen("test.txt","r+");//使用绑定的套接字传递数据
do{
len=fread(buf,1,1024,fd);
num++;
printf("read %d bytes\n",len);
if(len==0)
break;
if(send(client_fd, buf,len,0)==-1)
perror("send failed\n");
}while(1);
printf("transport over!\nread num is %d\n",num);
fclose(fd);
close(client_fd);
exit(0);
}
2. 客户端:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 3333
#define MAXDATASIZE 1024
void create_socket(int * sockfd)
{
if((*sockfd = socket(AF_INET, SOCK_STREAM, 0))==-1){
perror("create socket failed\n");
exit(1);
}
}
void set_serv_addr(struct sockaddr_in * serv_addr)
{
serv_addr->sin_family=AF_INET;
serv_addr->sin_port=htons(SERVPORT);
inet_pton(AF_INET, "10.2.150.202", &serv_addr->sin_addr);
bzero(&(serv_addr->sin_zero),8);
}
void myconnect(int sockfd, struct sockaddr_in * serv_addr)
{
int count_connet=0;
while(connect(sockfd,(struct sockaddr*)serv_addr,sizeof(struct sockaddr))==-1){//最好用循环实现,因为有时一次不能成功连接,需要连接第二次,甚至第三次
perror("connet failed\n");
count_connet++;
if(count_connet<10)
continue;
else
exit(1);
}
}
void transport(int sockfd,FILE * fd)
{
int recvbytes=0;
int num=0;
char buf[MAXDATASIZE];
do{
num++;
if((recvbytes=recv(sockfd,buf,MAXDATASIZE,0))==-1){
perror("recv data failed\n");
exit(1);
}
fwrite(buf,1,recvbytes,fd);
printf("Received: %d bytes\n",recvbytes);
}while(recvbytes!=0);
printf("received num is %d\n",num);
}
void main ()
{
int sockfd;
struct sockaddr_in serv_addr;
FILE *fd;
create_socket(&sockfd);
set_serv_addr(&serv_addr);
myconnect(sockfd,&serv_addr);
fd=fopen("receive.txt","w+");
transport(sockfd,fd);
fclose(fd);
close(sockfd);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)