浏览 11244 次
锁定老帖子 主题:C语言两个进程相互通信—socket
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-12-06
最后修改:2011-12-06
直接贴代码吧 client.c
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> int main() { int sockfd; int len; struct sockaddr_in address; int result; int i,byte; char char_recv,char_send; if((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1) { perror("socket"); exit(EXIT_FAILURE); } address.sin_family = AF_INET; address.sin_addr.s_addr = inet_addr("127.0.0.1"); address.sin_port = 8080; len = sizeof(address); if((result = connect(sockfd,(struct sockaddr *)&address,len)) == -1) { perror("connect"); exit(EXIT_FAILURE); } printf("please enter the context you want to send to server :"); scanf("%c",&char_send); if(byte = send(sockfd,&char_send,1,0) == -1) { perror("send"); exit(EXIT_FAILURE); } if(byte = recv(sockfd,&char_recv,1,0) == -1) { perror("recv"); exit(EXIT_FAILURE); } printf("receive from server %c\n",char_recv); close(sockfd); exit(0); } server.c
#include <sys/types.h> #include <sys/socket.h> #include <stdio.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #include <stdlib.h> char dict(char temp) { if(temp == 'Z') { return 'A'; } return temp+1; } int main() { int server_sockfd,client_sockfd; int server_len,client_len; struct sockaddr_in server_address; struct sockaddr_in client_address; int i,btye; char char_recv,char_send; server_address.sin_family = AF_INET; server_address.sin_addr.s_addr = inet_addr("127.0.0.1"); server_address.sin_port = 8080; server_len = sizeof(server_address); server_sockfd = socket(AF_INET,SOCK_STREAM,0); bind(server_sockfd,(struct sockaddr *)&server_address,server_len); listen(server_sockfd,5); printf("server waiting for connect\n"); client_len = sizeof(client_address); client_sockfd = accept(server_sockfd,(struct sockaddr *)&client_address,(socklen_t *)&client_len); if(btye = recv(client_sockfd,&char_recv,1,0) == -1) { perror("recv"); exit(EXIT_FAILURE); } printf("receive from client is %c\n",char_recv); char_send = dict(char_recv); if(btye = send(client_sockfd,&char_send,1,0) == -1) { perror("send"); exit(EXIT_FAILURE); } shutdown(client_sockfd,2); shutdown(server_sockfd,2); return 0; } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-12-14
你应该放到你博客上吧!
|
|
返回顶楼 | |
发表时间:2011-12-15
楼主这是在windows还是linux下运行的?
我在windows下不能执行.. 错误信息: a.c:2:24: fatal error: sys/socket.h: No such file or directory |
|
返回顶楼 | |
发表时间:2011-12-15
287854442 写道 楼主这是在windows还是linux下运行的? 我在windows下不能执行.. 错误信息: a.c:2:24: fatal error: sys/socket.h: No such file or directory 抱歉,忘了说明了,这个是在linux平台下运行的,因为使用了linux平台下的系统函数 |
|
返回顶楼 | |
发表时间:2011-12-20
有个socketpair, 貌似比这个要好。
|
|
返回顶楼 | |
发表时间:2011-12-20
iwindyforest 写道 有个socketpair, 貌似比这个要好。 学习了 了解了下: 对实现双工通信比较方便。 ths |
|
返回顶楼 | |
发表时间:2011-12-21
进程间通信,楼主应该用domain socket, socket 类型不应该是 AF_INET,应该是AF_LOCAL/AF_UNIX。
|
|
返回顶楼 | |
发表时间:2011-12-21
stormzm 写道 进程间通信,楼主应该用domain socket, socket 类型不应该是 AF_INET,应该是AF_LOCAL/AF_UNIX。 何解?两者有什么不同,求解 |
|
返回顶楼 | |
发表时间:2011-12-21
acme_ltt 写道 stormzm 写道 进程间通信,楼主应该用domain socket, socket 类型不应该是 AF_INET,应该是AF_LOCAL/AF_UNIX。 何解?两者有什么不同,求解 进程间通信可以用管道、消息队列、共享内存、信号量等方式。其实socket也可以用来进程间通信,如果通信的进程在同一台机器上,像楼主这样用AF_INET,127.0.0.1:80,是走了tcp/ip协议栈的。 socket其实提供了叫域套接字的方式通信,AF_UNIX,速度比AF_INET至少快一倍(unp说的,我也没测过)。 用法很简单,建议楼主看书或者google下就知道了。 |
|
返回顶楼 | |
发表时间:2011-12-21
stormzm 写道 acme_ltt 写道 stormzm 写道 进程间通信,楼主应该用domain socket, socket 类型不应该是 AF_INET,应该是AF_LOCAL/AF_UNIX。 何解?两者有什么不同,求解 进程间通信可以用管道、消息队列、共享内存、信号量等方式。其实socket也可以用来进程间通信,如果通信的进程在同一台机器上,像楼主这样用AF_INET,127.0.0.1:80,是走了tcp/ip协议栈的。 socket其实提供了叫域套接字的方式通信,AF_UNIX,速度比AF_INET至少快一倍(unp说的,我也没测过)。 用法很简单,建议楼主看书或者google下就知道了。 哦,明白你所说的意思了,本地进程通信,一般都用AF_UNIX,至于性能问题,我也没有测试过,改天有空的时候测试下,THS了 |
|
返回顶楼 | |