socket程序,还是搞不好啊。
时间:2010-08-21
来源:互联网
贴出来代码大家看一下。
cli
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <stdio.h>
- #include <string.h>
- #include <netinet/in.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <arpa/inet.h>
-
-
- #define MAXLINE 200
-
- int main(int argc, char *argv[])
- {
- int sockfd;
- ssize_t n;
- char buf[MAXLINE];
- struct sockaddr_in servaddr;
-
-
- if (argc != 2) {
- printf("usage: a.out <ip address>\n");
- exit(-1);
- }
-
- memset(buf, 0, sizeof(buf));
-
- if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- printf("socket error.\n");
- exit(-1);
- }
-
- memset(&servaddr, 0, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_port = htons(0);
- /* inet_aton("127.0.0.1", &servaddr.sin_addr); */
- inet_pton(AF_INET, argv[1], &servaddr.sin_addr);
-
- printf("connect to:%s\n", argv[1]);
- printf("ip dress is:[%4x]\n", servaddr.sin_addr.s_addr);
-
- if ( (connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr))) < 0) {
- printf("connect error.\n");
- exit(-1);
- }
-
- scanf("%s", buf);
- write(sockfd, buf, sizeof(buf));
- read(sockfd, buf, sizeof(buf));
-
- printf("%s\n", buf);
-
- exit(0);
-
- }
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <stdio.h>
- #include <string.h>
- #include <netinet/in.h>
- #include <unistd.h>
- #include <stdlib.h>
-
-
- #define MAXLINE 200
-
- int main(void)
- {
- int listenfd, connfd;
- pid_t childpid;
- socklen_t clilen;
- struct sockaddr_in cliaddr, servaddr;
-
- ssize_t n;
- char buf[MAXLINE];
-
-
-
- if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
- printf("socket error.\n");
- exit(-1);
- }
-
- bzero(&servaddr, sizeof(servaddr));
- servaddr.sin_family = AF_INET;
- servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
- servaddr.sin_port = htons(0);
-
- if (bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) < 0 ) {
- printf("bind error.\n");
- exit(-1);
- }
-
- if (listen(listenfd, 1024) < 0) {
- printf("listen error.\n");
- exit(-1);
- }
-
- for ( ; ; ) {
- clilen = sizeof(cliaddr);
- printf("=====\nready for accept.\n");
- if (connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen) < 0 ) {
- printf("accept error.\n");
- exit(-1);
- }
-
- if ( (childpid = fork()) == 0) { /* child */
- close(listenfd);
- memset(buf, 0, sizeof(buf));
- while ( (n = read(connfd, buf, MAXLINE)) > 0) {
- printf("recv from client:%s\n", buf);
- sprintf(buf, "serv return:%s", buf);
- write(connfd, buf, MAXLINE);
- exit(0);
- }
- }
-
- close(connfd);
-
- }
-
- }
- ./cli 127.0.0.1
- connect to:127.0.0.1
- ip dress is:[100007f]
- connect error.
就是客户端有问题。
请各位看一下到底哪里问题导致了 connect 出错呢。
谢谢。
作者: pandaiam 发布时间: 2010-08-21
服务器和客户端 显示得定义一个端口进行通信
作者: peijue 发布时间: 2010-08-21
我看有的教程上说,定义为0的话不就是自动选择端口吗。

作者: pandaiam 发布时间: 2010-08-21
把0随便设置了一个比较大的数后就可以了。
谢谢2楼,应该我没自己看教程啊。

作者: pandaiam 发布时间: 2010-08-21
iptables -A OUTPUT -p tcp --sport 8888 -j ACCEPT
也不行。 查看那个netstat专门查看端口的命令也没看到8888端口开启。我用8888换成1507也不行。请帮忙解释一下怎么搞。
作者: wohenry84 发布时间: 2010-08-21
端口号改大一点。我弄了个55555
作者: pandaiam 发布时间: 2010-08-21
怎么可能呀。我的是服务器的设置为8888呀。服务器不是一般的只要大于1024端口号不就可以啦?
作者: wohenry84 发布时间: 2010-08-21
作者: wi1she 发布时间: 2010-08-21
怎么可能呀。我的是服务器的设置为8888呀。服务器不是一般的只要大于1024端 ...
wohenry84 发表于 2010-08-21 10:03
server程序能正常启动的话应该就开始监听了。
贴一下代码吧。
作者: pandaiam 发布时间: 2010-08-21
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <strings.h>
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <arpa/inet.h>
- #define BUFSIZE 20
-
- int strlen(char *ptr);
- int main()
- {
- char buf[BUFSIZE];
- int ret, clilen ;
- int lisfd, newfd ;
- struct sockaddr_in saddr, caddr;
-
- bzero(&saddr, sizeof(saddr));
- // memset(&saddr, 0, sizeof(struct sockaddr_in));
- saddr.sin_family = AF_INET ;
- saddr.sin_port = 4507 ;
- saddr.sin_addr.s_addr = htons(INADDR_ANY);
-
- int sfd = socket(AF_INET, SOCK_STREAM, 0);
- if(sfd == -1)
- {
- printf("open the socket failed.\n");
- return -1 ;
- }
- ret = bind(sfd, (struct sockaddr *)&saddr, sizeof(struct sockaddr));
- if(ret != 0)
- {
- printf("bind the socket failed.\n");
- return -1 ;
- }
- lisfd = listen(sfd, 3);
- //printf("ready to accept.\n");
- while(1)
- {
- int sin_size = sizeof(caddr) ;
- newfd = accept(sfd, (struct sockaddr *)&caddr, &sin_size);
- printf("OK.\n");
- ret = recv(newfd, buf, strlen(buf)-1, 0);
- buf[strlen(buf)-1] = '\0';
- printf("%s\n", buf);
- }
- }
- int strlen(char *ptr)
- {
- int num = 0 ;
- while(ptr != '\0')
- {
- ptr++ ;
- num++ ;
- }
- }
作者: wohenry84 发布时间: 2010-08-21
作者: wohenry84 发布时间: 2010-08-21
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28