c语言在linux和FreeBSD下Socket编程的区别

如果要写程序用Socket进行通信,在语句上有什么区别吗?
如何将写好的Socket程序移植到Linux下

没啥区别

//服务端server.c
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#define SERVPORT 6000 /*服务器监听端口号 */
#define BACKLOG 10 /* 最大同时连接请求数 */
#define MAXDATASIZE 100

main()
{
char buf[MAXDATASIZE];
int sockfd,client_fd; /*sock_fd:监听socket;client_fd:数据传输socket */
struct sockaddr_in my_addr; /* 本机地址信息 */
struct sockaddr_in remote_addr; /* 客户端地址信息 */

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket创建出错!");
exit(1);
}
my_addr.sin_family=AF_INET;
my_addr.sin_port=htons(SERVPORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr)) == -1)
{
perror("bind出错!");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1)
{
perror("listen出错!");
exit(1);
}
while(1)
{
sin_size = sizeof(struct sockaddr_in);
if ((client_fd = accept(sockfd, (struct sockaddr *)&remote_addr, &sin_size)) == -1)
{
perror("accept出错");
continue;
}
printf("received a connection from %s\n", inet_ntoa(remote_addr.sin_addr));
if (!fork())
{ /* 子进程代码段 */
if ((recvbytes=recv(client_fd, buf, MAXDATASIZE, 0)) ==-1)
{
perror("recv出错!");
close(client_fd);
exit(0);
}
buf[recvbytes] = '\0';
printf("from client Received: %s",buf);

if (send(client_fd, "thanks!\n", 8, 0) == -1)
perror("send出错!");
close(client_fd);
exit(0);
}
close(client_fd);
}
}

//客户端client.c
#include<stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define SERVPORT 6000
#define MAXDATASIZE 100

main(int argc, char *argv[])
{
int sockfd, recvbytes;
char buf[MAXDATASIZE];
struct hostent *host;
struct sockaddr_in serv_addr;
if (argc < 2)
{
fprintf(stderr,"Please enter the server's hostname!\n");
exit(1);
}
if((host=gethostbyname(argv[1]))==NULL)
{
herror("gethostbyname出错!");
exit(1);
}
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket创建出错!");
exit(1);
}
serv_addr.sin_family=AF_INET;
serv_addr.sin_port=htons(SERVPORT);
serv_addr.sin_addr = *((struct in_addr *)host->h_addr);
bzero(&(serv_addr.sin_zero),8);
if (connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(struct sockaddr)) == -1)
{
perror("connect出错!");
exit(1);
}

if (send(sockfd, "hello!\n", 7, 0) == -1)
{
perror("send出错!");
exit(1);
}

if ((recvbytes=recv(sockfd, buf, MAXDATASIZE, 0)) ==-1)
{
perror("recv出错!");
exit(1);
}
buf[recvbytes] = '\0';
printf("Received: %s",buf);
close(sockfd);
}

参考资料:http://zhidao.baidu.com/question/142669015.html

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-07-14
详细的我觉得你应该看看APUE的描述,Socket最初是在BSD开发出来的,所以也叫BSD Socket,是UNIX的网络编程方法,所有的类UNIX系统都支持的,不同在于一些函数的实现,或着多一些少一些,但前提是不影响大局。所以在编程是尽量少用其他系统不支持的函数,或做出说明,这样就解决迁移性了。
BSD下开发的,估计到Linux,到Mac只需改函数。

自学c\/c++能行吗?我已经坚持2个月了,很迷茫。大家给点建议。
首先光说会 c++ ,你可能什么项目都做不了,你必须确定你的程序在什么平台下运行,是 windows 还是 linux 或者是 mac.你的项目是什么方面的应用,如果你是做windows 下的游戏,你还要会 directx 或 openGL ,做组件你要懂 com.数据库你要懂 Ado 和 ...

维基解密:攻击 Mac\/Linux 的CIA三款工具
运行时需要获得目标Mac电脑的root权限,CIA可以利用其进行内核级别的植入。移除Rootkit需将启动盘格式化或升级到新版本的系统。Aeris是一款C语言编写的自动植入工具,针对Linux(Debian, CentOS, Red Hat, FreeBSD以及Solaris)系统植入后门。它支持自动提取文件,常用于通过TLS加密信道从被入侵的设备中窃取信息。

文件描述符是什么
问题一:文件描述符和文件指针的区别 文件描述符:在linux系统中打开文件就会获得文件描述符,它是个很小的正整数。每个进程在PCB(Process Control Block)中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表项都有一个指向已打开文件的指针。文件指针:C语言中使用文件指针做为I\/O的句柄。

源码安装和yum安装的区别源码安装linux
(6)、\/procfilesystemsupport(CONFIG_PROC_FS)\/proc是存放Linux系统运行状态的虚拟文件系统,该项必须选择“y”。 (7)、Secondextendedfssupport(CONFIG_EXT2_FS)EXT2是Linux的标准文件系统,该项也必须选择“y”。 14、NetworkFileSystems(网络文件系统) (1)、NFSfilesystemsupport(CONFIG_NFS_FS)选择“y”,内核...

C语言如何获取嵌入式linux网卡上的mac地址
h> #include <stdlib.h> #pragma comment(lib, "IPHLPAPI.lib")#elif defined(__linux__) #include <string.h> \/\/strncpy #include <sys\/ioctl.h> #include <sys\/socket.h> #include <net\/if.h>#else \/\/bsd #include <sys\/types.h> \/\/FreeBSD u_int #...

...科学与技术的专业生需要其他什么知识,光编程语言就可以了吗?_百度...
2、熟悉Linux\/FreeBSD环境开发;3、深入理解C\/C++语言, 熟练掌握其它编程语言更佳;4、熟练掌握数据结构,具有良好的算法基础及系统分析能力;5、具备良好的编程习惯,能够编写高质量技术文档;6、良好的逻辑思维能力,对于创新及解决具有挑战性的问题充满激情;7、良好的团队合作意识和沟通能力;8、参与过开源项目开发者尤佳...

请问Linux 命令 ls -l 后出现的是什么意思
ls -l出来的是各个文件或目录的详细信息。Linux不仅系统性能稳定,而且是开源软件。其核心防火墙组件性能高效、配置简单,保证了系统的安全。在很多企业网络中,为了追求速度和安全,Linux操作系统不仅仅是被网络运维人员当作服务器使用,Linux既可以当作服务器,又可以当作网络防火墙是Linux的 一大亮点。

我想考思科认证中的网络安全,针对这个方向,我要学些什么呢?编程要...
再加上各种操作系统——Windows NT\/2000、Linux、AIX、Solaris、HP-UX、FreeBSD、TrueUNIX等等,要掌握的东西太多,操作系统上还有各种协议的实现和服务——TCP\/IP、ARP、apache...晕了没有?接下来还有语言——C\/C++是必学的,PERL\/SHELL也是要学学的,若是要成高手,ASM也逃不掉(这个东西学起来就...

计算机科学与技术,大二了,我该学些什么呢,现在只会写几行代码
7 C (C 语言) 8 C++ (C++ 语言) 9 Object-Oriented (面向对象) 10 Software Engineering (软件工程) 11 UNIX Programming (UNIX编程) 12 UNIX Administration (UNIX系统管理) 13 Networks (网络) 14 Windows Programming (Windows 编程) 15 Other (其它) 前言 推荐原则: 宁缺勿滥,决不混进糟...

没有一点基础的 C C++ VB JAVA 学哪个好呢
即便你熟悉了MFC,能够顺利开发Windows应用程序,如果你要编写一个Linux应用程序,MFC又派不上用场了,你必须学习Linux下C++开发的一套库函数。还有UNIX、FreeBSD、Mac OS……你学得过来吗?反观Java API,操作系统,你爱谁是谁,只要编写一次便可随处运行!3.在学术界获得了强有力的支持 由于免费、跨...

相似回答