linux 下套接字socket编程,求代码,实在写不出来。总出现各种各样的错误,
客户端想服务端发送一百个整数(数随意取),要求服务端返回这一百个数中大于100的数,和大于一百的数平均值,可能初学的原因,对socket编程理解不太透彻,希望还能提点建议...
客户端想服务端发送一百个整数(数随意取),要求服务端返回这一百个数中大于100的数,和大于一百的数平均值,可能初学的原因,对socket编程理解不太透彻,希望还能提点建议,一旦采纳,必有高分相送,真心求助,非诚勿扰
展开
2个回答
展开全部
linux 编程一般都不会直接空敲代码的,比较熟练的程序员也要经常查man page的。所以,要有信心,有恒心。从基础做起,多看书,多练习。
你说的程序其实挺简单的,写一个,比较ugly,仅给楼主练习作参考。
tcpclient.c
#include "debug.h"
int main (int argc, char *argv[])
{
int cfd;
char buf[BUFSIZE];
struct sockaddr_in addr;
int addrlen = sizeof (addr);
int data[DATALEN] = { 0 };
int recv_data[DATALEN] = { 0 };
int i, j, n, average = 0;
if (argc < 2)
{
printf ("usage : %s server_ip server_port", argv[0]);
exit (0);
}
cfd = socket (PF_INET, SOCK_STREAM, 0);
check_err ("socket", cfd);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr (argv[1]);
addr.sin_port = htons (atoi (argv[2]));
connect (cfd, (struct sockaddr *)&addr, addrlen);
check_err ("socket", cfd);
for (i = 0; i < DATALEN; i++)
data[i] = i + 50;
for (i = 0; i < DATALEN; i++)
{
sprintf (buf, "%d", data[i]);
check_err ("write", write (cfd, buf, sizeof (buf)));
}
i = j = 0;
for (i = 0; i < DATALEN && read (cfd, buf, sizeof (buf)) > 0; i++)
{
if ((n = atoi (buf)) > 100)
{
recv_data[j++] = n;
printf ("recv data : %d\n", recv_data[i]);
average += n;
}
else
break;
}
average /= j;
printf ("\naverage = %d\n", average);
close (cfd);
return 0;
}
tcpserver.c
#include "debug.h"
int main (int argc, char *argv[])
{
int ret;
int sfd;
int cfd;
char buf[BUFSIZE];
struct sockaddr_in addr;
int len = sizeof (addr);
int recv_data[DATALEN] = {0};
int i, j, n;
if (argc < 2)
{
printf ("usage : %s port\n", argv[0]);
exit (-1);
}
sfd = socket (PF_INET, SOCK_STREAM, 0);
check_err ("socket", errno);
addr.sin_family = AF_INET;
addr.sin_port = htons (atoi (argv[1]));
addr.sin_addr.s_addr = INADDR_ANY;
bind (sfd, (struct sockaddr *)&addr, len);
check_err ("bind", errno);
listen (sfd, BACKLOG);
check_err ("listen", errno);
i = j = n = 0;
if ((cfd = accept (sfd, (struct sockaddr *)&addr, &len)) > 0)
{
for (i = 0; i < DATALEN && read (cfd, buf, BUFSIZE) > 0; i++)
{
if ((n = atoi (buf)) > 100)
recv_data[j++] = n;
}
}
for (i = 0; i < j; i++)
{
sprintf (buf, "%d", recv_data[i]);
check_err ("write", write (cfd, buf, sizeof(buf)));
}
check_err ("write", write (cfd, "0", sizeof(buf)));
close (cfd);
return 0;
}
debug.h
#ifndef _DEBUG_H
#define _DEBUG_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#define BACKLOG 10 // for max listen fds
#define DATALEN 100
#define BUFSIZE 16
#define check_err(name, ret) \
if (ret < 0) \
{ \
perror (name); \
exit (-1); \
}
#define check_null(name, ret) \
if (if ret == NULL) \
{ \
perror (name); \
exit (-1); \
}
#endif
编译后,先运行server端,然后运行client端,可以看到server发回的数据,及平均值。
百度知道不能贴代码,排版很差,将就可以看吧,有问题追问。
你说的程序其实挺简单的,写一个,比较ugly,仅给楼主练习作参考。
tcpclient.c
#include "debug.h"
int main (int argc, char *argv[])
{
int cfd;
char buf[BUFSIZE];
struct sockaddr_in addr;
int addrlen = sizeof (addr);
int data[DATALEN] = { 0 };
int recv_data[DATALEN] = { 0 };
int i, j, n, average = 0;
if (argc < 2)
{
printf ("usage : %s server_ip server_port", argv[0]);
exit (0);
}
cfd = socket (PF_INET, SOCK_STREAM, 0);
check_err ("socket", cfd);
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = inet_addr (argv[1]);
addr.sin_port = htons (atoi (argv[2]));
connect (cfd, (struct sockaddr *)&addr, addrlen);
check_err ("socket", cfd);
for (i = 0; i < DATALEN; i++)
data[i] = i + 50;
for (i = 0; i < DATALEN; i++)
{
sprintf (buf, "%d", data[i]);
check_err ("write", write (cfd, buf, sizeof (buf)));
}
i = j = 0;
for (i = 0; i < DATALEN && read (cfd, buf, sizeof (buf)) > 0; i++)
{
if ((n = atoi (buf)) > 100)
{
recv_data[j++] = n;
printf ("recv data : %d\n", recv_data[i]);
average += n;
}
else
break;
}
average /= j;
printf ("\naverage = %d\n", average);
close (cfd);
return 0;
}
tcpserver.c
#include "debug.h"
int main (int argc, char *argv[])
{
int ret;
int sfd;
int cfd;
char buf[BUFSIZE];
struct sockaddr_in addr;
int len = sizeof (addr);
int recv_data[DATALEN] = {0};
int i, j, n;
if (argc < 2)
{
printf ("usage : %s port\n", argv[0]);
exit (-1);
}
sfd = socket (PF_INET, SOCK_STREAM, 0);
check_err ("socket", errno);
addr.sin_family = AF_INET;
addr.sin_port = htons (atoi (argv[1]));
addr.sin_addr.s_addr = INADDR_ANY;
bind (sfd, (struct sockaddr *)&addr, len);
check_err ("bind", errno);
listen (sfd, BACKLOG);
check_err ("listen", errno);
i = j = n = 0;
if ((cfd = accept (sfd, (struct sockaddr *)&addr, &len)) > 0)
{
for (i = 0; i < DATALEN && read (cfd, buf, BUFSIZE) > 0; i++)
{
if ((n = atoi (buf)) > 100)
recv_data[j++] = n;
}
}
for (i = 0; i < j; i++)
{
sprintf (buf, "%d", recv_data[i]);
check_err ("write", write (cfd, buf, sizeof(buf)));
}
check_err ("write", write (cfd, "0", sizeof(buf)));
close (cfd);
return 0;
}
debug.h
#ifndef _DEBUG_H
#define _DEBUG_H
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <errno.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <arpa/inet.h>
#define BACKLOG 10 // for max listen fds
#define DATALEN 100
#define BUFSIZE 16
#define check_err(name, ret) \
if (ret < 0) \
{ \
perror (name); \
exit (-1); \
}
#define check_null(name, ret) \
if (if ret == NULL) \
{ \
perror (name); \
exit (-1); \
}
#endif
编译后,先运行server端,然后运行client端,可以看到server发回的数据,及平均值。
百度知道不能贴代码,排版很差,将就可以看吧,有问题追问。
追问
我是按老师给的client和server的模板改代码来写得,我改总是不对,你写得代码和老师给的差别挺大的,我真的是初学者,希望能解释一下,老师的知识给了两个client和server的互相输入打招呼的代码,两个代码的都分别包含了最后写得那些头文件
你的代码我也基本看懂了,真是太感谢你大半夜的回答问题了。还有你能给个qq么?以后有问题也能请教一下,我不会一直那种啥都问的,只是我实在搞不懂的时候才会去问你。
追答
嗯,由于写的比较仓促,所以没有打注释,应该是我的失误。
这个代码我测试是通过的,其实解释也没多少,相信socket通信基本的步骤你是明白的。
代码里要注意的地方就是发送信息的条数,也就是循环次数的控制。
比如tcpserver.c里这一句:
for (i = 0; i 0; i++)
//i 0 前面,两者位置不能互换,因为read会阻塞。
老师给的代码是什么样子?如果有必要的话给我看看吧,hello能发,所有的都能发。
通信方式的话,qq我真的很少用,用baidu hi交流吧,离线也可以发给我,当时我可能看不到,但是看到了一定会回得。
展开全部
这类问题不难,核心就是socket通信,你可以这样做试试:
1、先将client与server打通,例如client端发送一个数字server端可以接收
2、server端接收到后可以给client端一个回执
3、实现问题的要求
再加参考下老师的代码应该可以做到,这个跟操作系统的平台没有关系的
1、先将client与server打通,例如client端发送一个数字server端可以接收
2、server端接收到后可以给client端一个回执
3、实现问题的要求
再加参考下老师的代码应该可以做到,这个跟操作系统的平台没有关系的
追问
示例代码就是发送一个简单的hello的。这个已经没问题了,能通过,中间应该如何传递信息我就不会拉,关键是那些函数咋用,楼上给的答案,我今天改到我的代码里面,编译没问题,可就是没有结果
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询