求一个简单的linux 原始套接字 客户端/服务器端程序

abc78400123 2011-12-24 10:47:18
求一个简单的linux 原始套接字的客户端/服务器端程序

只要能实现收发数据就行

谢谢了
...全文
261 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengfoo 2011-12-24
  • 打赏
  • 举报
回复
linux下包含类似这样的头文件就行了
其他的稍作修改,api都差不多

#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<unistd.h>
#include<fcntl.h>
#include<stdlib.h>
#include<signal.h>
#include<sys/wait.h>

pengfoo 2011-12-24
  • 打赏
  • 举报
回复
改下头文件就行了 主要API都差不多[Quote=引用 5 楼 abc78400123 的回复:]
引用 3 楼 kuzuozhou 的回复:

基于udp的客户端程序:
C/C++ code

#include "winsock2.h"
#include "stdio.h"
void main()
{
//加载套接字(winsock)库,加载这段代码拷贝于MSDN中WSAStartup的介绍
WORD wVersionRequested;
WSADATA wsaData;……
[/Quote]
onlycs 2011-12-24
  • 打赏
  • 举报
回复
原理都一样,找本书,里面应该会有些代码,自己在组合一下就OK了
abc78400123 2011-12-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kuzuozhou 的回复:]

基于udp的客户端程序:
C/C++ code

#include "winsock2.h"
#include "stdio.h"
void main()
{
//加载套接字(winsock)库,加载这段代码拷贝于MSDN中WSAStartup的介绍
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionReque……
[/Quote]


我要的是linux下的
abc78400123 2011-12-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kuzuozhou 的回复:]

这个百度一下网上一大堆的
[/Quote]

搜了啊

原始套接字的并且linux下 的没搜到啥啊?
pengfoo 2011-12-24
  • 打赏
  • 举报
回复
基于udp的客户端程序:

#include "winsock2.h"
#include "stdio.h"
void main()
{
//加载套接字(winsock)库,加载这段代码拷贝于MSDN中WSAStartup的介绍
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 ); //版本号为1.1
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
//创建套接字
SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0); //注意第二个参数和TCP设置不同
SOCKADDR_IN addrServer; //服务器地址结构
addrServer.sin_addr.S_un.S_addr=inet_addr("127.0.0 .1"); //服务器地址
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); //服务器端口号
char tempBuf[100];
char recvBuf[100];
char sendBuf[100];
int len=sizeof(SOCKADDR);
while(1)
{
printf("plese input the message:\n");
gets(sendBuf); //得到用户的键盘输入
sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOC KADDR*)&addrServer,sizeof(SOCKADDR));
int result=recvfrom(sockClient,recvBuf,100,0,(SOCKADDR *)&addrServer,&len);
if(result==SOCKET_ERROR)
{
int errCode=WSAGetLastError();
printf("error:%d",errCode);
break; //退出循环
}
else
{
if(recvBuf[0]=='q') //对方请求退出
{
//同样将退出请求发送回去
sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*)& addrServer,sizeof(SOCKADDR));
printf("the chat end!");
break;
}
else
{
//将对方发送过来的信息前段加上IP地址进行输出
sprintf(tempBuf,"%s said:%s",inet_ntoa(addrServer.sin_addr),recvBuf);
printf("%s\n",tempBuf);
}
}
}
closesocket(sockClient);
WSACleanup();
}


pengfoo 2011-12-24
  • 打赏
  • 举报
回复
基于udp的源端程序:

#include "winsock2.h"
#include "stdio.h"
void main()
{
//加载套接字(winsock)库,加载这段代码拷贝于MSDN中WSAStartup的介绍
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 ); //版本号为1.1
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
//创建套接字
//注意第二个参数和TCP设置不同
SOCKET sockServer=socket(AF_INET,SOCK_DGRAM,0);
SOCKADDR_IN addrServer; //设置服务器端套接字的地址结构的相关属性
addrServer.sin_addr.S_un.S_addr=htonl(INADDR_ANY); //设置IP
addrServer.sin_family=AF_INET;
addrServer.sin_port=htons(6000); //设置端口号
//将套接字和服务器地址结构绑定
bind(sockServer,(SOCKADDR*)&addrServer,sizeof(SOCK ADDR));
SOCKADDR_IN addrClient;
int len=sizeof(SOCKADDR);
char recvBuf[100];
char tempBuf[100];
char sendBuf[100];
while(1)
{
//从客户端接收数据
int result=recvfrom(sockServer,recvBuf,100,0,(SOCKADDR *)&addrClient,&len);
if(result==SOCKET_ERROR)
{
int errCode=WSAGetLastError();
printf("error:%d",errCode);
break; //退出循环
}
else
{
if(recvBuf[0]=='q') //对方请求退出
{
//同样将退出请求发送回去
sendto(sockServer,"q",strlen("q")+1,0,(SOCKADDR*)& addrClient,sizeof(SOCKADDR));
printf("the chat end!");
break;
}
else
{
//将对方发送过来的信息前段加上IP地址进行输出
sprintf(tempBuf,"%s said:%s",inet_ntoa(addrClient.sin_addr),recvBuf);
printf("%s\n",tempBuf);
//将用户的键盘输入发送到对方
printf("pleas input the message:\n");
gets(sendBuf); //得到键盘输入内容 sendto(sockServer,sendBuf,strlen(sendBuf)+1,0,(SOC KADDR*)& addrClient,sizeof(SOCKADDR));
}
}
}
closesocket(sockServer);
WSACleanup();
}


pengfoo 2011-12-24
  • 打赏
  • 举报
回复
这个百度一下网上一大堆的
abc78400123 2011-12-24
  • 打赏
  • 举报
回复
求指点下

我写的不能传输数据

我调试客服端程序时:发现

/*向服务器端发送字符串welcome*/
if(b = sendto(sockfd,"welcome\n",10,0,(struct sockaddr *)&server,sizeof(server)) < 0 )
{
perror("sendto error le");

}

这个b 的值为0

说明了,并未发送字符串出去,为什么呢?
abc78400123 2011-12-24
  • 打赏
  • 举报
回复
服务器端

#include <stdio.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>

#define MAXDATASIZE 100


int main(int argc,char *argv[])
{
struct protoent *protocol;
unsigned long inaddr = 0L;
char buf[MAXDATASIZE];
int num;
struct sockaddr_in client;
int len;
int sockfd;

if((protocol = getprotobyname("icmp")) == NULL)
{
perror("unknow protocol icmp");
exit(1);
}
/*创建使用ICMP协议的原始套接字*/
if((sockfd = socket(AF_INET,SOCK_RAW,protocol->p_proto)) < 0)
{
perror("unknow protocol icmp");
exit(2);
}

/*接收客户端的消息,并向客户端发送字符串good */
while (1)
{
len = sizeof(client);
num = recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr *)&client,&len);
if (num < 0)
{
perror("recvfrom() error\n");
exit(1);
}
buf[num] = '\0';
printf("you got a message <%s> from client.\n",buf);
sendto(sockfd,"good\n",5,0,(struct sockaddr *)&client,len);

}
close(sockfd);

}
abc78400123 2011-12-24
  • 打赏
  • 举报
回复
我试着写了一个,可是不能传输数据。

客服端
#include <stdio.h>
#include <signal.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/ip_icmp.h>
#include <netdb.h>


#define MAXDATASIZE 100


int main(int argc,char *argv[])
{

struct hostent *host;
struct protoent *protocol;
unsigned long inaddr = 0L;
char buf[MAXDATASIZE];
int num;
struct sockaddr_in server,peer;
int len;
int sockfd;
int b;

if(argc < 2)
{
printf("Usage:%s<IP Address>\n",argv[0]);
exit(1);
}

if((host=gethostbyname(argv[1]))==NULL)
{
printf("gethostbyname() error\n");
exit(1);
}

/*生成使用ICMP的原始套接字*/
if((sockfd = socket(AF_INET,SOCK_RAW,protocol->p_proto)) < 0)
{
perror("unknow protocol icmp");
exit(2);
}

/*初始化服务器地址*/
bzero(&server,sizeof(server));
server.sin_family=AF_INET;
server.sin_addr = *((struct in_addr *)host->h_addr);
printf("%s\n",inet_ntoa(server.sin_addr));

/*向服务器端发送字符串welcome*/
if(b = sendto(sockfd,"welcome\n",10,0,(struct sockaddr *)&server,sizeof(server)) < 0 )
{
perror("sendto error le");

}

/*接收服务器端的信息,并输出*/
while (1)
{
len = sizeof(peer);
num = recvfrom(sockfd,buf,MAXDATASIZE,0,(struct sockaddr *)&peer,&len);
if (num < 0)
{
perror("recvfrom() error\n");
exit(1);
}
buf[num] = '\0';
printf("server message:\n",buf);

}
close(sockfd);

}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧