这2段代码就是C之间的SOCKET通讯 希望那位高手帮个忙 谢谢了 我的邮箱 lenj@163.com
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <bits/signum.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SRV_PORT 6666
#define BUFF_SIZE 2048
struct cmd_header {
unsigned int len;
unsigned int cmd;
unsigned int cmd_type;
unsigned int crc32;
};
#define CMD_HEADER_SIZE 16
#define CMD_DEV_ONLINE 1
//public static final int CMD_DEV_ONLINE = 1;
#define RESP_DEV_ONLINE_SIZE (16+20+4+4)
#define CMD_SINGLE_VAR_ONLINE 10
static void sig_alarm(int);
int
main(int argc, char *argv[] )
{
int fd;
struct sockaddr_in srv_addr, cli_addr;
socklen_t len;
char buff[BUFF_SIZE];
int resp_len;
int rc = 0;
struct sigaction sig_act;
struct cmd_header *cmd_hdr; //命令头
char *cmd_body; //命令体
sigemptyset(&sig_act.sa_mask);
sig_act.sa_handler = sig_alarm;
sig_act.sa_flags = 0;
sigaction(SIGALRM, &sig_act, NULL);
fd = socket(AF_INET, SOCK_STREAM, 0);
if (fd < 0) {
printf("cannot create socket!\n");
return (1);
}
memset(&srv_addr, 0, sizeof(srv_addr) );
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(SRV_PORT);
inet_pton(AF_INET, "127.0.0.1", &srv_addr.sin_addr);
rc = connect(fd, (struct sockaddr *) &srv_addr, sizeof(srv_addr) );
if (rc < 0) {
printf("cannot connect to server\n");
return (1);
}
cmd_hdr = (struct cmd_header *) buff;
cmd_hdr->len = CMD_HEADER_SIZE + 20;
cmd_hdr->cmd_type = 0;
cmd_hdr->cmd = CMD_DEV_ONLINE;
cmd_hdr->crc32 = 0x44444444;
cmd_body = buff + CMD_HEADER_SIZE;
memcpy(cmd_body, "dev_uid: 0x12345678", 20);
send(fd, buff, cmd_hdr->len, 0);
/* set up an alarm to receive the query result */
alarm(5); /* 5 seconds */
memset(buff, 0, BUFF_SIZE);
resp_len = recv(fd, buff, BUFF_SIZE, 0);
if (resp_len < 0) {
if (errno == EINTR)
printf("timeout\n");
else
printf("error receiving data\n");
} else {
/* do some sanity checks */
if (resp_len != cmd_hdr->len)
printf("correpted data received\n");
else {
int status, offline_reason;
status = *(unsigned int *) (cmd_body+20);
status = *(unsigned int *) (cmd_body+20+4);
printf("cmd_type: %d\n", cmd_hdr->cmd_type);
printf("cmd: %d\n", cmd_hdr->cmd);
printf("crc32: 0x%8x\n", cmd_hdr->crc32);
printf("dev_uid: %s\n", cmd_body);
printf("dev_status: %d\n", status);
printf("offline reason: %d\n", offline_reason);
}
}
close(fd);
return (0);
}
static void sig_alarm(int signo)
{
return;
}
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#include <bits/signum.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define SRV_PORT 6666
#define BUFF_SIZE 2048
struct cmd_header {
unsigned int len;
unsigned int cmd;
unsigned int cmd_type;
unsigned int crc32;
};
#define CMD_HEADER_SIZE 16
#define CMD_DEV_ONLINE 1
#define RESP_DEV_ONLINE_SIZE (16+20+4+4)
#define CMD_SINGLE_VAR_ONLINE 10
static void sig_alarm(int);
int
main(int argc, char *argv[] )
{
int srv_fd, cli_fd;
struct sockaddr_in srv_addr, cli_addr;
socklen_t len;
pid_t pid;
char buff[BUFF_SIZE];
int req_len;
int rc = 0;
srv_fd = socket(AF_INET, SOCK_STREAM, 0);
if (srv_fd < 0) {
printf("cannot create socket!\n");
return (1);
}
memset(&srv_addr, 0, sizeof(srv_addr) );
srv_addr.sin_family = AF_INET;
srv_addr.sin_port = htons(SRV_PORT);
srv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
rc = bind(srv_fd, (struct sockaddr *) &srv_addr, sizeof(srv_addr) );
if (rc < 0) {
printf("cannot bind on port %d\n", SRV_PORT);
return (1);
}
rc = listen(srv_fd, 5);
if (rc < 0) {
printf("cannot listen on port %d\n", SRV_PORT);
return (1);
}
len = sizeof(cli_addr);
while (1) {
cli_fd = accept(srv_fd, (struct sockaddr *) &cli_addr, &len);
if (cli_fd < 0) {
printf("error when accepting connection\n");
continue;
}
if ( (pid = fork() == 0) ) {
struct cmd_header *cmd_hdr;
char *cmd_body;
struct sigaction sig_act;
char response[BUFF_SIZE];
sigemptyset(&sig_act.sa_mask);
sig_act.sa_handler = sig_alarm;
sig_act.sa_flags = 0;
sigaction(SIGALRM, &sig_act, NULL);
while (1) {
alarm(30);
req_len = recv(cli_fd, buff, BUFF_SIZE, 0);
if (req_len < 0) {
if (errno == EINTR)
printf("socket timeout\n");
else
printf("error when receiving data\n");
alarm(0);
close(cli_fd);
exit(1);
} else {
if (req_len == 0)
continue;
alarm(0);
/* process the incoming request */
cmd_hdr = (struct cmd_header *) buff;
cmd_body = buff + sizeof(struct cmd_header);
switch (cmd_hdr->cmd_type) {
case (0):
switch (cmd_hdr->cmd) {
case (CMD_DEV_ONLINE): {
char *dev_uid = cmd_body;
unsigned int *status, *offline_reason;
printf("crc32: 0x%08x\n", cmd_hdr->crc32);
dev_uid[20] = '\0';
printf("dev_uid: %s\n", dev_uid);
/* now do some stuff to get the result ... */
// do_something();
/* setup the response message:
* 1) set up the header, compute CRC;
* 2) fill up the message body.
* In this example, they're DEV_UID and,
* STATUS and OFFLIE_REASON.
*/
memcpy(response, cmd_hdr, 16);
memcpy(response+16, cmd_body, 20);
cmd_hdr = (struct cmd_header *) response;
cmd_hdr->len = CMD_HEADER_SIZE+20+4+4;
cmd_hdr->crc32 = 0x5a5a5a5a;
cmd_body = response + CMD_HEADER_SIZE;
status = (unsigned int *) (cmd_body+20);
offline_reason = status+1;
*status = 1;
*offline_reason = 0;
send(cli_fd, response, RESP_DEV_ONLINE_SIZE, 0);
}
break;
case (CMD_SINGLE_VAR_ONLINE):
break;
default:
printf("unknow command\n");
break;
}
break;
case (1):
break;
default:
break;
}
}
}
close(cli_fd);
exit(0);
}
}
close(srv_fd);
return (0);
}
static void sig_alarm(int signo)
{
return;
}
相关推荐
java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别 Java 提供两种不同的类型:引用类型和原始类型(或...
程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class lianxi02 { public static void main(String[] args) { int count = 0; for(int i=...
jwx是开源的java公众号开发MVC框架,基于spring配置文件和微信消息或事件注解,通过微信上下文处理一个或多个微信公众号服务请求。目的主要有两个,其一生封装微信请求xml消息为java实体对象,将返回对象转换为xml...
9.MATLAB 7.0 不能在 64 位的 CPU 下运行:可能需要找个带 64 位的 Java 虚拟机替换原来的。 10.MATLAB 有没有注释一段的功能:选中一段代码,Ctrl+R 就是区段注释,选中一段代码,Ctrl+T 取消区段注释。 MATLAB ...
2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance Alliance Alliance Alliance 什么是开放手机联盟? 开放手机联盟, Open Handset Alliance :是美国 Google 公司与 2007 年 ...
本例主要是实现了struts2+spring3+...然后将文件夹拷贝到 这个datadir 的文件夹里面(注意:您的安装路径可能跟我的不一样,请不要复制我的这个路径) 4,OK 现在就可以完美运行ssh框架的实例了,开始行动吧!
而苹果只允许安装在GPT(GUID)分区表下,一个硬盘只能在MBR和GPT二者选择其一,将MBR改成GPT会把磁盘上所有分区所有数据删除。修改Mac OS X Snow Leopard安装镜像,是使苹果安装盘能识别安装在MBR分区表下。 二、...
那么,就把”C:\Program Files\EditPlus 2\“替换成你当前软件的路径。 其它提示找不到文件的解决方法同上 【10】软件技巧——设置editplus支持其它文字,如韩文 在editplus里打开文件,出来打开文件对话框;然后...
那么,就把”C:\Program Files\EditPlus 2\“替换成你当前软件的路径。 其它提示找不到文件的解决方法同上 【10】软件技巧——设置editplus支持其它文字,如韩文 在editplus里打开文件,出来打开文件对话框;然后...
因此,选项C`将private int m 改成 static int m`是正确的做法。 3. **构造函数声明**: - 构造函数的名称必须与类名相同,并且没有返回类型。选项B`public A(int x) { ... }`是一个正确的构造函数声明。 4. **...
把这个网站所有的能用浏览器通过GET的方式获取到的资源全部抓取到本地,包括网页和各 种类型的文件,如:图片、flash、mp3、zip、rar、exe等文件。可以将整个网站完整地下传至 硬盘内,并能保持原有的网站结构精确...
你可以放心大胆的使用这个工具生成代码,一点点调试模板,直到完成数据库表到页面增删改成功能代码一键生成. 不满意的可以通过还原功能按时间点还原. 7. 作者信息 工龄: 1.5年 技能: java,C#,html,js,oracle,mysql....
}//把读到的段输入字节流中 return buf; } protected Vector<String> pageDown() { String strParagraph = ""; Vector<String> lines = new Vector(); while (lines.size() ) { //不能大于给定的...
2. **JSP (Java Server Pages) 实现**: 对于JSP环境,我们可以将Base64编码封装到单独的`base64.jsp`文件中,然后在主页面中引用它: ```jsp String thunderUrl = ThunderEncode("http://请改成你需要的链接...
1. 在 IE 中使用时,签入的时候会提示文件名不一致,这是 IE 本身的 BUG,Chrome 没有这个问题,可以将 system.document.name.mismatch.check 的值设置为否,这样就不会检查文件名了。 2. 要设置邮件服务器,修改 ...
那么,就把”C:\Program Files\EditPlus 2\“替换成你当前软件的路径。 其它提示找不到文件的解决方法同上 【10】软件技巧——设置editplus支持其它文字,如韩文 在editplus里打开文件,出来打开文件对话框;然后...
一个好的测试管理工具应该能把以上几个阶段都管理起来。 测试人员每时每刻都在度量别人的工作成果,而测试人员的工作成果又由谁来度量呢?度量的标准和依据是什么呢?软件测试的度量是测试管理必须仔细思考的问题。...
${"我的文件保存在C:\\盘"} ${'我名字是\"annlee\"'} 输出结果是: 我的文件保存在C:\盘 我名字是"annlee" FreeMarker支持如下转义字符: \";双引号(u0022) \';单引号(u0027) \\;反斜杠(u005C) \n;换行(u000A) \r;...
【描述】:“把伴音歌曲和歌词改成121.mp3和121.lrc放在SD卡下的/K歌软件/DownloadPath/文件夹下就行。”这段描述指出了应用的基本数据结构,即伴奏音乐(如121.mp3)和对应的歌词文件(如121.lrc)。伴奏音乐通常以...