0 0

那位能帮我把这2段C改成JAVA的 谢谢了5

这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;
}
C 
2009年10月11日 23:42

2个答案 按时间排序 按投票排序

0 0

java的处理和c的差异较大,5分给得太少了

我可以帮你写,不过这两天没啥时间。。

2009年10月12日 17:22
0 0

还得先看懂c呢,你还不如直接用java调jni再调这段c代码

2009年10月12日 01:23

相关推荐

    超级有影响力霸气的Java面试题大全文档

     java.lang.String类是final类型的,因此不可以继承这个类、不能修改这个类。为了提高效率节省空间,我们应该用StringBuffer类 6、int 和 Integer 有什么区别  Java 提供两种不同的类型:引用类型和原始类型(或...

    最新JAVA编程题全集_50题及答案

    程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。 public class lianxi02 { public static void main(String[] args) { int count = 0; for(int i=...

    java微信公众号MVC开发框架

    jwx是开源的java公众号开发MVC框架,基于spring配置文件和微信消息或事件注解,通过微信上下文处理一个或多个微信公众号服务请求。目的主要有两个,其一生封装微信请求xml消息为java实体对象,将返回对象转换为xml...

    matlab集锦.docx

    9.MATLAB 7.0 不能在 64 位的 CPU 下运行:可能需要找个带 64 位的 Java 虚拟机替换原来的。 10.MATLAB 有没有注释一段的功能:选中一段代码,Ctrl+R 就是区段注释,选中一段代码,Ctrl+T 取消区段注释。 MATLAB ...

    新版Android开发教程.rar

    2 开放手机联盟 --Open --Open --Open --Open Handset Handset Handset Handset Alliance Alliance Alliance Alliance 什么是开放手机联盟? 开放手机联盟, Open Handset Alliance :是美国 Google 公司与 2007 年 ...

    Struts2+Spring3+Hibernate3 用户管理系统实例源码

    本例主要是实现了struts2+spring3+...然后将文件夹拷贝到 这个datadir 的文件夹里面(注意:您的安装路径可能跟我的不一样,请不要复制我的这个路径) 4,OK 现在就可以完美运行ssh框架的实例了,开始行动吧!

    Mac OS X Snow Leopard 10A432雪豹 BT种子

    而苹果只允许安装在GPT(GUID)分区表下,一个硬盘只能在MBR和GPT二者选择其一,将MBR改成GPT会把磁盘上所有分区所有数据删除。修改Mac OS X Snow Leopard安装镜像,是使苹果安装盘能识别安装在MBR分区表下。 二、...

    EditPlus 2整理信箱的工具

    那么,就把”C:\Program Files\EditPlus 2\“替换成你当前软件的路径。 其它提示找不到文件的解决方法同上 【10】软件技巧——设置editplus支持其它文字,如韩文 在editplus里打开文件,出来打开文件对话框;然后...

    editplus 代码编辑器html c++ jsp css

    那么,就把”C:\Program Files\EditPlus 2\“替换成你当前软件的路径。 其它提示找不到文件的解决方法同上 【10】软件技巧——设置editplus支持其它文字,如韩文 在editplus里打开文件,出来打开文件对话框;然后...

    面向对象专题练习.docx

    因此,选项C`将private int m 改成 static int m`是正确的做法。 3. **构造函数声明**: - 构造函数的名称必须与类名相同,并且没有返回类型。选项B`public A(int x) { ... }`是一个正确的构造函数声明。 4. **...

    snoics-reptile 网页爬虫2.0

    把这个网站所有的能用浏览器通过GET的方式获取到的资源全部抓取到本地,包括网页和各 种类型的文件,如:图片、flash、mp3、zip、rar、exe等文件。可以将整个网站完整地下传至 硬盘内,并能保持原有的网站结构精确...

    玩转模板--自动代码生成工程

    你可以放心大胆的使用这个工具生成代码,一点点调试模板,直到完成数据库表到页面增删改成功能代码一键生成. 不满意的可以通过还原功能按时间点还原. 7. 作者信息 工龄: 1.5年 技能: java,C#,html,js,oracle,mysql....

    txt文档阅读器

    }//把读到的段输入字节流中 return buf; } protected Vector&lt;String&gt; pageDown() { String strParagraph = ""; Vector&lt;String&gt; lines = new Vector(); while (lines.size() ) { //不能大于给定的...

    网页制作中迅雷连接的制作

    2. **JSP (Java Server Pages) 实现**: 对于JSP环境,我们可以将Base64编码封装到单独的`base64.jsp`文件中,然后在主页面中引用它: ```jsp String thunderUrl = ThunderEncode("http://请改成你需要的链接...

    OpenKM6.2安装与配置(默认安装与SQLSERVER数据库安装)

    1. 在 IE 中使用时,签入的时候会提示文件名不一致,这是 IE 本身的 BUG,Chrome 没有这个问题,可以将 system.document.name.mismatch.check 的值设置为否,这样就不会检查文件名了。 2. 要设置邮件服务器,修改 ...

    Editplus 3[1].0

    那么,就把”C:\Program Files\EditPlus 2\“替换成你当前软件的路径。 其它提示找不到文件的解决方法同上 【10】软件技巧——设置editplus支持其它文字,如韩文 在editplus里打开文件,出来打开文件对话框;然后...

    测试培训教材

    一个好的测试管理工具应该能把以上几个阶段都管理起来。 测试人员每时每刻都在度量别人的工作成果,而测试人员的工作成果又由谁来度量呢?度量的标准和依据是什么呢?软件测试的度量是测试管理必须仔细思考的问题。...

    FreeMark学习笔记

    ${"我的文件保存在C:\\盘"} ${'我名字是\"annlee\"'} 输出结果是: 我的文件保存在C:\盘 我名字是"annlee" FreeMarker支持如下转义字符: \";双引号(u0022) \';单引号(u0027) \\;反斜杠(u005C) \n;换行(u000A) \r;...

    android仿K歌达人

    【描述】:“把伴音歌曲和歌词改成121.mp3和121.lrc放在SD卡下的/K歌软件/DownloadPath/文件夹下就行。”这段描述指出了应用的基本数据结构,即伴奏音乐(如121.mp3)和对应的歌词文件(如121.lrc)。伴奏音乐通常以...

Global site tag (gtag.js) - Google Analytics