Beej的网络编程入门教程 第二篇 平台与编译器
2010-02-15 22:39
561 查看
看了目录你可能觉得很有意思(或者很奇怪)5.1.getaddrinfo()---我要准备开始了! getaddrinfo()系统调用后加一个"我要准备开始了"是怎么回事?这是原作者为了方便读者而加上去的,通讯(这里是套接字通讯)嘛当然有双方才可以,所以就做了一点拟人化描述。请正确理解。下面我们就进入正文了。
1.基础知识
1.1.平台与编译器
后面出现的代码在linux下使用gcc编译完全没有问题,并且这些代码可以使用gcc为各平台产生可执行程序。可以确定的是不能直接在windows系统下使用,有关详细信息请看后面一节"注意事项"。
1.2.注意事项
1.2.1.solaris/sunos程序员注意事项
在solaris或sunos上编译时,你需要修改一些参数以便加载相关的库文件。就像下面这样:
$cc -o server server.c -lnsl - lsocket - lresdv
如果还有错误,你可以试试加入参数"-lxnet",我不太清楚这个参数的作用,也许一些人员需要用到。
另外一个需要注意的地方是在使用setsocketopt()函数时,此函数的原型与linux上不同。如下:
替换
int yes= 1;
为
char yes= '1';
我没有sun的工作环境,所以上面说的这些没有测试;这些信息均是大家通过邮件告知的。
1.2.2.windows程序员注意事项
之前我在windows上做过一些工作,我并不喜欢它,但是我不得不说windows是一个非常好的操作系统。
有人说失落让人成长,确实这样;我很高兴自己已经有十多年没有用windows进行个人工作了。我觉得使用windows非常轻松,是的我很肯定这一点。
我还是要鼓励你去试试linux、BSD或一些unix系统。大家都有自己喜欢的,windows一族一定也愿意了解这些信息。
一件很cool的事是安装cygwin,这是一个unix在windows中的工具,我听说这样做的程序不用修改就可以进行编译了。
也许你想在纯windows下编程,你可真勇敢。也许你听我我的话想马上换个unix回来!不,不我只是开个玩笑。我现在渐渐觉得windows挺友好的。
你要做的事:首先不要忘记加入系统头文件如下:
#include <winsock.h>
等一下!在开始之前还需要调用WSAStartup()才能使用套接字进行工作,代码如下:
你还必需通知编译器连接winsock库,通常是wsock32.lib或winsock32.lib或ws2_32.lib(2.0版本使用)。使用vc++时,选择项目(project)菜单,选择设置(setting)连接选项卡,有一项对象/模块,键入"wsock32.lib"(或你需要的库文件)。
我还听说:当你使用完套接字后需要调用WSACleanup(),查看在线帮助可获得详细信息。在windows系统下使用本文档中的例子时,大多数是没有问题的有一部分可能有异常发生。一个要注意的是close(),使用它不能关闭套接字而要使用closesocket()。还有select()只能在声明的套接字上使用,不能在文件上使用。
windows上还有一个csocket类可以使用。查看你的编译器帮助得到更详细的信息。
最后,我听说windows系统中没有fork()调用,在我的例子中有使用过。你可以使用CreateProcess()代替fork()。fork()没有参数,CreateProcess()有一大堆的参数。如果你不想使用它,那么CreateThread()是一个不错的选择,它更容易些。不幸的是关于多线程的话题超出了本文的范围,你知道我只能说到这里了。
第二篇结束。
1.基础知识
1.1.平台与编译器
后面出现的代码在linux下使用gcc编译完全没有问题,并且这些代码可以使用gcc为各平台产生可执行程序。可以确定的是不能直接在windows系统下使用,有关详细信息请看后面一节"注意事项"。
1.2.注意事项
1.2.1.solaris/sunos程序员注意事项
在solaris或sunos上编译时,你需要修改一些参数以便加载相关的库文件。就像下面这样:
$cc -o server server.c -lnsl - lsocket - lresdv
如果还有错误,你可以试试加入参数"-lxnet",我不太清楚这个参数的作用,也许一些人员需要用到。
另外一个需要注意的地方是在使用setsocketopt()函数时,此函数的原型与linux上不同。如下:
替换
int yes= 1;
为
char yes= '1';
我没有sun的工作环境,所以上面说的这些没有测试;这些信息均是大家通过邮件告知的。
1.2.2.windows程序员注意事项
之前我在windows上做过一些工作,我并不喜欢它,但是我不得不说windows是一个非常好的操作系统。
有人说失落让人成长,确实这样;我很高兴自己已经有十多年没有用windows进行个人工作了。我觉得使用windows非常轻松,是的我很肯定这一点。
我还是要鼓励你去试试linux、BSD或一些unix系统。大家都有自己喜欢的,windows一族一定也愿意了解这些信息。
一件很cool的事是安装cygwin,这是一个unix在windows中的工具,我听说这样做的程序不用修改就可以进行编译了。
也许你想在纯windows下编程,你可真勇敢。也许你听我我的话想马上换个unix回来!不,不我只是开个玩笑。我现在渐渐觉得windows挺友好的。
你要做的事:首先不要忘记加入系统头文件如下:
#include <winsock.h>
等一下!在开始之前还需要调用WSAStartup()才能使用套接字进行工作,代码如下:
#include <winsock.h> ...... //省略了一些代码 { WSADATA wsaData; //如果这句有错 //WSAData wsaData; //试试这句 //MAKEWORD(1,1) 使用winsock 1.1 MAKEWORD(2.0) 使用winsock 2.0 if(WSAStartup(MAKEWORD(1.1), &wsaData) != 0) { fprintf(stder, "WSAStartup failed./n"); exit(1); } ...... }
你还必需通知编译器连接winsock库,通常是wsock32.lib或winsock32.lib或ws2_32.lib(2.0版本使用)。使用vc++时,选择项目(project)菜单,选择设置(setting)连接选项卡,有一项对象/模块,键入"wsock32.lib"(或你需要的库文件)。
我还听说:当你使用完套接字后需要调用WSACleanup(),查看在线帮助可获得详细信息。在windows系统下使用本文档中的例子时,大多数是没有问题的有一部分可能有异常发生。一个要注意的是close(),使用它不能关闭套接字而要使用closesocket()。还有select()只能在声明的套接字上使用,不能在文件上使用。
windows上还有一个csocket类可以使用。查看你的编译器帮助得到更详细的信息。
最后,我听说windows系统中没有fork()调用,在我的例子中有使用过。你可以使用CreateProcess()代替fork()。fork()没有参数,CreateProcess()有一大堆的参数。如果你不想使用它,那么CreateThread()是一个不错的选择,它更容易些。不幸的是关于多线程的话题超出了本文的范围,你知道我只能说到这里了。
第二篇结束。
相关文章推荐
- Beej的网络编程入门教程 第一篇 版权与目录
- Beej的网络编程入门教程 第六篇 必要的系统调用 socket
- Beej的网络编程入门教程 第五篇 从IPv4到IPv6
- Beej的网络编程入门教程 第六篇 必要的系统调用 getaddrinfo
- Beej的网络编程入门教程 第三篇 什么是套接字
- Beej的网络编程入门教程 第四篇 IP地址和端口
- Java的Socket网络编程基础知识入门教程
- Python Twisted网络编程框架与异步编程入门教程
- TCP/UDP网络编程入门教程之二:TCP Server端——socket与文件描述符
- java入门教程-12.1Java网络编程之IP地址和InetAddress类
- Python视频教程(入门语法、游戏开发、网络编程)
- 使用Python中的线程进行网络编程的入门教程
- java入门教程-12.2Java网络编程之统一资源定位符URL
- Java Socket网络编程入门教程
- java网络编程入门教程
- TCP/UDP网络编程入门教程之一:TCP Server端——建模
- ACE网络编程 --ACE库入门:中篇-ACE程序员教程
- Python网络编程之多线程入门教程【python教程入门】
- TCP/UDP网络编程入门教程之二:TCP Server端——socket与文件描述符
- Java网络编程基础教程之Socket入门实例