摘要: 服务器端程序的编译gcc -o file_server file_server.c客户端程序的编译gcc -o file_client file_client.c服务器程序和客户端程应当分别运行在2台计算机上.服务器端程序的运行,在一个计算机的终端执行./file_server客户端程序的运行,在另一个计算机的终端中执行./file_client 运行服务器程序的计算机的IP地址根据提示输入要传输的服务器上的文件,该文件在服务器的运行目录上在实际编程和测试中,可以用2个终端代替2个计算机,这样就可以在一台计算机上测试网络程序,服务器端程序的运行,在一个终端执行./file_server客户端程 阅读全文
posted @ 2010-12-17 14:36 flyxiang 阅读(513) 评论(0) 推荐(0) 编辑
摘要: 编译方式:gcc -pthread -o chat_server chat_server.c#include pthread.h#include sys/errno.h#include "chat.h"#define LENGTH_OF_LISTEN_QUEUE (20)#define USER_AMOUNT_MAX (50)#define NOT_LOGIN (-1)#define NOT_IN_USE (NOT_LOGIN -1)#define USER_ID_SIZE (ID_SIZE)typedef struct user{ char user_ID[USER_ID_SIZE] 阅读全文
posted @ 2010-12-17 14:33 flyxiang 阅读(740) 评论(0) 推荐(1) 编辑
摘要: 编译方式:gcc -o chat_client chat_client.c#include "chat.h"#include unistd.h // for fork#include sys/signal.h // for signal#include sys/wait.h // for wait#include fcntl.hstatic char user_ID[BUFFER_SIZE]; //一个很大的缓冲区,实际ID_SIZE内有效static char password[BUFFER_SIZE]; //一个很大的缓冲区,实际PASSWORD_SIZEE内有效stati 阅读全文
posted @ 2010-12-17 14:32 flyxiang 阅读(615) 评论(0) 推荐(0) 编辑
摘要: 服务器端的实现:#include sys/types.h#include sys/socket.h#include netinet/in.h//sockaddr_in等结构的定义#include netdb.h//addrinfo等结构的定义#include stdio.h#include unistd.h#include dirent.h#include string.h#include sys/stat.h#include fcntl.h#include stdlib.h#define TRUE 1#define LISTEN_PORT 3499 阅读全文
posted @ 2010-12-17 14:27 flyxiang 阅读(859) 评论(0) 推荐(0) 编辑
摘要: 刚才转载了一篇文章《情景分析“C语言的const关键字”》,csdn上也有一篇《Const用 法小结》,可能很多人看了这两篇文章之后就对const绝望了,太复杂了。其实const并不复杂,它是有规则的,不然设计语言的语法就不好弄了(大家看 一下编译原理就好理解了)。下面就说一下我对const的理解:我觉得,语言里面的关键字,都有一个修饰域(即这个关键字修饰那块范围),还有一个修饰方向(即从 那里开始修饰)。对于c类似的语言(c,c++,java),关键字的修饰方向都是从向右的,即关键字不会修饰它左边的东西。从编译原理的角度就好理解为 什么这样了,我们现在编译器采用的基本都是LR(k)进行语法分 阅读全文
posted @ 2010-12-17 12:46 flyxiang 阅读(426) 评论(0) 推荐(1) 编辑
摘要: 1) #define是预处理指令,在编译预处理时进行简单的替换,不作正确性检查,不关含义是否正确照样带入,只有在编译已被展开的源程序时才会发现可能的错误并报错。例如: #define PI 3.1415926 程序中的:area=PI*r*r 会替换为3.1415926*r*r 如果你把#define语句中的数字9 写成字母g 预处理也照样带入。 2)typedef是在编译时处理的。它在自己的作用域内给一个已经存在的类型一个别名,但是You cannot use the typedef specifier inside a function definition。 3)typedef int 阅读全文
posted @ 2010-12-17 12:45 flyxiang 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 三个函数的申明分别是:void* realloc(void* ptr, unsigned newsize);void* malloc(unsigned size);void* calloc(size_t nelem, size_t elsize);都在stdlib.h函数库内它们的返回值都是请求系统分配的地址,如果请求失败就返回NULLmalloc用于申请一段新的地址,参数size为需要内存空间的长度,如:char* p;p=(char*)malloc(20);calloc与malloc相似,参数nelem为申请地址的单位元素长度,elsize为元素个数,如:char* p;p=(char*) 阅读全文
posted @ 2010-12-17 12:42 flyxiang 阅读(462) 评论(0) 推荐(0) 编辑
摘要: 1.这样的初始化有什么问题?char *p = malloc(10); 编译器提示“非法初始式” 云云。答:这个声明是静态或非局部变量吗?函数调用只能出现在自动变量(即局部非静态变量) 的初始式中。因为静态变量的地址必须在编译的过程中就确定下来而malloc()申请的内存地址是在运行时确定的。2. *p++ 自增p 还是p 所指向的变量?答:后缀++ 和-- 操作符本质上比前缀一目操作的优先级高, 因此*p++ 和*(p++) 等价, 它自增p 并返回p 自增之前所指向的值。要自增p 指向的值, 使用(*p)++, 如果副作用的顺序无关紧要也可以使用++*p。3 我有一个char * 型指针正 阅读全文
posted @ 2010-12-17 12:40 flyxiang 阅读(169) 评论(0) 推荐(0) 编辑
摘要: linux下用C开发多线程程序,Linux系统下的多线程遵循POSIX线程接口,称为pthread。Returns: 0 if OK, error number on failureC99 中新增加了 restrict 修饰的指针: 由 restrict 修饰的指针是最初唯一对指针所指向的对象进行存取的方法,仅当第二个指针基于第一个时,才能对对象进行存取。对对象的存取都限定于基于由 restrict 修饰的指针表达式中。 由 restrict 修饰的指针主要用于函数形参,或指向由 malloc() 分配的内存空间。restrict 数据类型不改变程序的语义。 编译器能通过作出 restrict 阅读全文
posted @ 2010-12-17 12:36 flyxiang 阅读(533) 评论(0) 推荐(0) 编辑
摘要: linux 系统中单个进程的最大线程数有其最大的限制 PTHREAD_THREADS_MAX这个限制可以在 /usr/include/bits/local_lim.h 中查看对 linuxthreads 这个值一般是 1024,对于 nptl 则没有硬性的限制,仅仅受限于系统的资源这个系统的资源主要就是线程的 stack 所占用的内存,用 ulimit -s 可以查看默认的线程栈大小,一般情况下,这个值是 8M可以写一段简单的代码验证最多可以创建多少个线程int main(){int i = 0;pthread_t thread;while (1) {if (pthread_create(&t 阅读全文
posted @ 2010-12-17 12:35 flyxiang 阅读(770) 评论(0) 推荐(0) 编辑