免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4500 | 回复: 12
打印 上一主题 下一主题

关于Linux下socket编程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-28 16:49 |只看该作者 |倒序浏览
最近在写一个socket通信的东西,就写了一个简单的客户端和服务器端用来测试,如果我声明的是流式套接字(stream socket)的话,建立TCP连接的话就好用,但是我想发的是UDP包,所以得用数据报套接字SOCK_DGRAM,那么服务器段怎么写呢,无法监听
服务器代码如下:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/un.h>
#include <unistd.h>
#define EHCO_PORT  514
#define MAX_CLIENT_NUM 10
int main()
{
int socketfd;
socketfd = socket(AF_INET, SOCK_DGRAM, 0);

if(socketfd == -1)
{
printf("errno=%d \n", errno);
exit(1);
}
else
{
printf("socket create successfully \n";
}
struct sockaddr_in sa;
bzero(&sa, sizeof(sa));
sa.sin_family = AF_INET;
sa.sin_port = htons(EHCO_PORT);
sa.sin_addr.s_addr = htons(INADDR_ANY);
bzero(&(sa.sin_zero), ;
if(bind(socketfd, (struct sockaddr *)&sa, sizeof(sa))!= 0)
{
printf("bind failed \n";
printf("errno=%d \n", errno);
exit(1);
}
else
{
printf("bind successfully \n";
}
//listen
if(listen(socketfd ,MAX_CLIENT_NUM) != 0)
{
printf("listen error \n";
exit(1);
}
else
{
printf("This is the server!\n";
printf("listen successfully ,listening...\n";
}
int clientfd;
struct sockaddr_in clientAdd;
char buff[1001];
socklen_t len = sizeof(clientAdd);
int closing =0;
while( closing == 0 && (clientfd = accept(socketfd, (struct sockaddr *)&clientAdd, &len)) >0 )
{
printf("A client login!\n";
printf("The client's info:\n";
printf("*****************************************\n";
//printf("IP:%s\n",clientAdd->sin_addr);
printf("Sin_family:%d\n",clientAdd.sin_family);
printf("Sin_port:%d\n",clientAdd.sin_port);
printf("*****************************************\n";
int n;
while(1)
{
memset(buff,0,sizeof(buff));
n = recv(clientfd,buff, 1000,0 );
//write(STDOUT_FILENO, buff, n);
printf("The client's input:%s \n", buff);
printf("number of receive bytes = %d \n", n);
send(clientfd, buff, n, 0);
buff[n] = '\0';
if(strcmp(buff, "quit ") == 0)
{
break;
}
else if(strcmp(buff, "close ") == 0)
{
//server closing
closing = 1;
printf("server is closing \n");
break;
}
}
close(clientfd);
}
close(socketfd);
return 0;
}

论坛徽章:
0
2 [报告]
发表于 2008-04-28 16:49 |只看该作者
客户端:

#include <stdio.h>

#include <string.h>

#include <errno.h>

#include <netdb.h>

#include <sys/socket.h>

#include <stdlib.h>

#include <sys/types.h>

#include <sys/un.h>

#include <unistd.h>

#define EHCO_PORT 514

#define MAX_CLIENT_NUM 10

int main()

{

int sockfd;

sockfd = socket(AF_INET, SOCK_DGRAM, 0);



if(sockfd == -1)

{

printf("errno=%d \n", errno);

exit(1);

}

else

{

printf("socket create successfully \n";

}

struct sockaddr_in sa;

bzero(&sa, sizeof(sa));

sa.sin_family = AF_INET;

sa.sin_port = htons(EHCO_PORT);

sa.sin_addr.s_addr = inet_addr("10.2.1.193";

bzero(&(sa.sin_zero), ;



int result=connect(sockfd,(struct sockaddr *)&sa,sizeof(struct sockaddr));

if(result==-1)
{
    printf("connect error!\n";
}
else printf("connect success!\n";

char buff[1001]; //send to server
char rbuff[1001];//receive from the server

int closing =0;
printf("This is the client!\n";
printf("Load to the server!\n";
while( closing == 0 )

{
int n;
int m;
while(1){
printf("The client's input: ";
scanf("%s",&buff);
n=strlen(buff);

if(strcmp(buff, "close " == 0)

{

//server closing

closing = 1;

printf("close the client \n";

break;

}
printf("number of send bytes = %d \n", n);
send(sockfd, buff, n, 0);
memset(rbuff, 0, sizeof(rbuff));
m=read(sockfd,rbuff,1000);
rbuff[m]='\0';
printf("The server return:%s\n",rbuff);

}
close(sockfd);

}

close(sockfd);

return 0;

}

高手们,快急救啊...

论坛徽章:
0
3 [报告]
发表于 2008-04-28 16:57 |只看该作者
建立TCP连接,想要发送UDP的包....
:em11: :em11: :em11: :em11:

论坛徽章:
0
4 [报告]
发表于 2008-04-28 17:16 |只看该作者
贴代码的时候将 禁用smiles 选上,这样代码清晰一点
别人粘帖你的代码进行测试也不会有那么多麻烦

[ 本帖最后由 zhuhefang2006 于 2008-4-28 17:20 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-04-28 17:17 |只看该作者
是,很严重的错误
但是该怎么改呢
recvfrom(...); 怎么写的
怎么获得的客户端的请求的呢
sendto(...);
又怎么发的

论坛徽章:
0
6 [报告]
发表于 2008-04-28 17:17 |只看该作者
楼主的问题描述的不是很清楚,是要实现udp协议通信吗?

论坛徽章:
0
7 [报告]
发表于 2008-04-28 17:25 |只看该作者
是的,6楼
有什么例子可以参考下吗

论坛徽章:
0
8 [报告]
发表于 2008-04-28 17:26 |只看该作者
回复 #5 tyz 的帖子

给你看一个很简单的例子吧:
服务器端echo客户端发送过来的数据
服务器端代码如下

  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <errno.h>

  6. #define MAXLINE 256

  7. void dg_echo(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen)
  8. {
  9.         int n;
  10.         socklen_t len;
  11.         char mesg[MAXLINE];

  12.         for (; ;)
  13.         {
  14.                 len = clilen;
  15.                 n = recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);
  16.                 sendto(sockfd, mesg, n, 0, pcliaddr, len);
  17.         }
  18. }



  19. void err_exit(char *s)
  20. {
  21.         printf("%s", s);
  22.         exit(0);
  23. }

  24. int main(int argc, char *argv[])
  25. {
  26.         int sockfd;
  27.         struct sockaddr_in servaddr, cliaddr;

  28.         sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  29.         if (sockfd == -1)
  30.                 err_exit("socket error\n");

  31.         bzero(&servaddr, sizeof(servaddr));
  32.         servaddr.sin_port = htons(2008);
  33.         servaddr.sin_family = AF_INET;
  34.         servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
  35.        
  36.         if (bind(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1)
  37.                 err_exit("bind error\n");

  38.         dg_echo(sockfd, (struct sockaddr *)&cliaddr, sizeof(cliaddr));
  39. }
复制代码

论坛徽章:
0
9 [报告]
发表于 2008-04-28 17:28 |只看该作者
客户端代码如下:
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <netinet/in.h>
  4. #include <sys/socket.h>
  5. #include <sys/types.h>

  6. #define MAXLINE 256

  7. void err_exit(char *s)
  8. {
  9.         printf("%s", s);
  10.         exit(0);
  11. }

  12. void dg_cli(FILE *fp, int sockfd, const struct sockaddr *pservaddr, socklen_t servlen)
  13. {
  14.         int n;
  15.         char sendline[MAXLINE], recvline[MAXLINE + 1];
  16.         while (fgets(sendline, MAXLINE, fp) != NULL)
  17.         {
  18.                 sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);
  19.                 n = recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);
  20.                 recvline[n] = 0;
  21.                 fputs(recvline, stdout);
  22.         }
  23. }

  24. int main(int argc, char *argv[])
  25. {
  26.         int sockfd;
  27.         struct sockaddr_in servaddr;

  28.         if (argc != 2)
  29.                 err_exit("usage: ./c.out <IPaddrss>\n");

  30.         bzero(&servaddr, sizeof(servaddr));
  31.         servaddr.sin_family = AF_INET;
  32.         servaddr.sin_port = htons(2008);
  33.         inet_pton(AF_INET, argv[1], &servaddr.sin_addr);

  34.         sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  35.         dg_cli(stdin, sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

  36.         exit(0);
  37. }

复制代码

论坛徽章:
0
10 [报告]
发表于 2008-04-28 17:30 |只看该作者
建议楼主看一下unix网络编程chapter8 Elementary UDP Sockets内容
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP