c語言通信庫-ag真人国际官网
❶ c語言程序設計,通訊錄管理系統
/*【用c語言編寫具有數據插入、修改、刪除、顯示和查詢功能的電話薄管理程序】
1、數據包括:人名、工作單位、電話號碼和e-mail地址。
2、可對記錄中的姓名和電話號碼進行修改。
3、可增加或刪除記錄。
4、可顯示所有保存的記錄。
5、可按人名或電話號碼進行查詢。
另:採用結構體數組和文件系統實現。結構體包括人名、工作單位、電話號碼和e-mail
絕對原創,2010年7月12日晚剛寫完測試通過的,純c語言! */
#include
#include
#include
#define szstr 64
#define filedb "c:\\contact.txt"
struct contact {
char name[szstr];/*姓名*/
char unit[szstr];/*工作單位*/
char tele[szstr];/*電話*/
char mail[szstr];/*mail*/
};
typedef struct contact con;
#define bname 1
#define bunit 2
#define btele 4
#define bmail 8
#define bfull 0xff
int oper[5] = {bfull, bname, bunit, btele, bmail};
void input(con * s, int mask)
{
if(mask & bname) { printf("請輸入學生姓名:"); scanf("%s", s->name); }
if(mask & bunit) { printf("請輸入工作單位:"); scanf("%s", s->unit); }
if(mask & btele) { printf("請輸入聯系電話:"); scanf("%s", s->tele); }
if(mask & bmail) { printf("請輸入電子郵件:"); scanf("%s", s->mail); }
}/*end input*/
void show (int id, con * s)
{
if(!s) return ;
if(id)
printf("%d\t%s\t%s\t%s\t%s\n",
id, s->name , s->unit , s->tele , s->mail );
else
printf("【姓名】%s【工作單位】%s【電話】%s【電郵】%s\n",
s->name , s->unit , s->tele , s->mail );
/*end if*/
}/*end show*/
void regist(void)
{
con s; file * f = 0;
input(&s, bfull);
f = fopen(filedb, "ab");
fwrite(&s,sizeof(s),1,f);
fclose(f);
printf("資料已保存!\n");
}/*end regist*/
int browse(char * key, fpos_t * p, con * s)
{
file * f =0; int i = 0, r = 0; con t;
char * a = 0, * b = 0; fpos_t q;
if(!s) return 0;
f = fopen(filedb, "rb");
if(!f) {
printf("資料庫暫無記錄\n");
return 0;
}/*end if*/
printf("編號\t姓名\t單位\t電話\t電郵\n");
printf("------------------------------------------------\n");
while(!feof(f)) {
fgetpos(f, &q);
r = fread(&t, sizeof(t), 1, f);
if(r<1)break;
if(t.name[0]==0) continue;
if(key) {
a = strstr(t.name , key);
b = strstr(t.tele , key);
if(a == 0 && b == 0) continue;
}/*end if*/
if(p) *p = q;
if(s) memcpy(s, &t, sizeof(t));
i ;
show(i, &t);
}/*end while*/
fclose(f);
printf("------------------------------------------------\n");
return i;
}/*end browse*/
fpos_t query(con * s)
{
char key[szstr]=""; fpos_t p = 0; int r = 0;
printf("請輸入姓名或者電話號碼:");
scanf("%s", key);
r = browse(key, &p, s);
return r?p:-1;
}/*end query*/
void clear(void)
{
file * f = 0; con s;
fpos_t p = query(&s);
if(p<0) return;
f = fopen(filedb, "rb ");
fsetpos(f, &p);
memset(&s, 0, sizeof(s));
fwrite(&s, sizeof(s),1, f);
fclose(f);
printf("記錄已刪除!\n");
}/*end clear*/
void modify(void)
{
file * f = 0; con s; int cmd = 0;
fpos_t p = query(&s);
if(p<0) return;
f = fopen(filedb, "rb ");
fsetpos(f, &p);
for(;;) {
show(0, &s);
printf("請選擇:1-姓名;2-工作單位;3-電話;4-電郵;5-保存並退出;6-放棄修改並退出\n");
scanf("%d", &cmd);
switch(cmd) {
case 1:
case 2:
case 3:
case 4:
input(&s, oper[cmd]);
break;
case 5:
fsetpos(f, &p);
fwrite(&s, sizeof(s), 1, f);
case 6:
fclose(f);
return;
default:
printf("錯誤的操作,請重新輸入。\n");
}/*end case*/
}/*mext*/
}/*end clear*/
int main(void)
{
int cmd = 0; con s;
for(;;) {
printf("歡迎使用通信簿!請選擇:1-添加;2-查詢;3-刪除;4-修改;5-全部輸出;0-退出\n");
scanf("%d", &cmd);
switch(cmd) {
case 0: return 0;
case 1: regist(); break;
case 2: query(&s); break;
case 3: clear(); break;
case 4: modify(); break;
case 5: browse(0, 0, &s); break;
}//end case
}
return 0;
}
linux c編程:建立 tcp連接
linux c編程中使用tcp(transmission control protocol,傳輸控制協議)協議建立客戶端和伺服器之間連接的過程稱之為tcp連接,是一種可靠而強大的通信協議,在linux c編程中可用於建立資料庫、網路通信等等。本文介紹了在linux c編程中如何建立tcp連接,以及其中遇到的一些問題。
在linux c語言編程中,可以使用socket()函數建立一個tcp連接。socket()函數的第一個參數指定協議族,例如af_inet指定ipv4協議族,第二個參數指定套接字類型,例如sock_stream指定流式套接字。
接下來,可以使用bind()函數將套接字與系統分配的ip地址和埠綁定,然後使用listen()函數使套接字變為被動模式,並啟動監聽進程,此時伺服器已准備就緒,等待客戶端的連接。最後,使用accept()函數接受客戶端的連接,當接受到客戶端的連接後,伺服器就可以使用建立的socket與客戶端通信了。
示例代碼如下:
// 創建 socket
int sockfd;
struct sockaddr_in addr;
// af_inet: ipv4 協議族
// sock_stream: 流式套接字
sockfd = socket(af_inet, sock_stream, 0);
// 設置 ip 地址
addr.sin_family = af_inet;
addr.sin_port = htons(9999); //埠號
addr.sin_addr.s_addr = inet_addr(“127.0.0.1”); //ip地址
// 綁定 ip 和 埠
bind(sockfd, (struct sockaddr*)&addr, sizeof(addr));
// 監聽客戶端請求
listen(sockfd, 20);
// 接受 客戶端連接請求
struct sockaddr_in client_addr;
socklen_t client_addr_len;
int client_fd = accept(sockfd, (struct sockaddr*)&client_addr,
&client_addr_len);
上述步驟完成後,客戶端和伺服器的tcp連接建立完畢。在linux c編程中,使用tcp協議建立客戶端和伺服器之間連接過程雖然繁瑣,但是它可以實現可靠的數據傳輸和優秀的網路通信,這個代價值得支付。
總而言之,在linux c編程中使用tcp協議建立客戶端和伺服器之間連接,可以通過socket()、bind()、listen()、accept()等函數將客戶端和伺服器建立可靠的數據傳輸連接,這是一個蠻耗時的過程,但也值得支付,因為通過這種方式可以實現穩定的網路通信。
❸ 為什麼還要用c語言編寫socket呢現在java這么方便,想知道c來編socket有什麼好處,尤其在linux下,謝謝!
socket(也叫套接字)最初是在unix系統上開發的網路通信的介面。
後來微軟等公司將它移植到了windows下,當然原來unix系統下的還是好用的。
對於socket可以這樣理解:
它就是一個函數庫,裡麵包括大量的函數和相應的數據結構,已經實現好了。
它支持網路通信。
程序開發人員可以通過閱讀相關的函數文檔,了解函數的使用方法,進行網路的編程。
兩種形式的socket:流式套接字,對應與tcp協議。
數據報套接字,對應與udp協議。
有本《linux環境高級編程》你可以看看
java 和其它語言之間進行socket通信使用socket和serversocket類。
用java編寫server,c語言編寫client,當然可以實現通信(示例在最後)。
1、socket和serversocket類庫位於java.net包中。serversocket用於伺服器端,socket 是建立網路連接時使用的。在連接成功時,應用程序兩端都會產生一個socket實例,操作這個實例,完成所需的會話。對於一個網路連接來說,套接字是平等的,並沒有差別,不因為在伺服器端或在客戶端而產生不同級別。不管是socket還是serversocket它們的工作都是通過socketimpl類及其子類完成的。
重要的socket api:
java.net.socket繼承於java.lang.object,有八個構造器,其方法並不多,使用頻繁的三個方法:
. accept方法用於產生"阻塞",直到接受到一個連接,並且返回一個客戶端的socket對象實例。"阻塞"是一個術語,它使程序運行暫時"停留"在這個地方,直到一個會話產生,然後程序繼續;通常"阻塞"是由循環產生的。
. getinputstream方法獲得網路連接輸入,同時返回一個iutputstream對象實例,。
. getoutputstream方法連接的另一端將得到輸入,同時返回一個outputstream對象實例。
注意:其中getinputstream和getoutputstream方法均會產生一個ioexception,它必須被捕獲,因為它們返回的流對象,通常都會被另一個流對象使用。
2.如何開發一個server-client模型的程序
開發原理:
伺服器,使用serversocket監聽指定的埠,埠可以隨意指定(由於1024以下的埠通常屬於保留埠,在一些操作系統中不可以隨意使用,所以建議使用大於1024的埠),等待客戶連接請求,客戶連接後,會話產生;在完成會話後,關閉連接。
客戶端,使用socket對網路上某一個伺服器的某一個埠發出連接請求,一旦連接成功,打開會話;會話完成後,關閉socket。客戶端不需要指定打開的埠,通常臨時的、動態的分配一個1024以上的埠。
下面這個程序用java建立了一個伺服器,它一直監聽10000埠,等待用戶連接,而用戶端則可以使用c寫的程序來連接該伺服器。
本程序在建立連接後給客戶端返回一段信息,然後結束會話。這個程序一次只能接受一個客戶連接。
import java.net.*;
import java.io.*;
public class server
{
private serversocket ss;
private socket socket;
private bufferedreader in;
private printwriter out;
public server()
{
try
{
ss = new serversocket(10000);
while (true)
{
socket = ss.accept();
in = new bufferedreader(new inputstreamreader(socket.getinputstream()));
out = new printwriter(socket.getoutputstream(),true);
string line = in.readline();
out.println("you input is :" line);
out.close();
in.close();
socket.close();
}
ss.close();
}
catch (ioexception e)
{}
}
public static void main(string[] args)
{
new server();
}
}
❹ 在windows下用c語言如何實現socket網路編程,需要用到哪些頭文件或者庫
需要用到的頭文件包含:
#include
#include
與linux環境下socket編程相比,windows環境多了一個步驟:啟動或者初始化winsock庫
winsock,一種標准api,一種網路編程介面,用於兩個或多個應用程序(或進程)之間通過網路進行數據通信。具有兩個版本:
winsock 1:
windows ce平台支持。
頭文件:winsock.h
庫:wsock32.lib
winsock 2:
部分平台如windows ce貌似不支持。通過前綴wsa可以區別於winsock 1版本。個別函數如wsastartup、wsacleanup、wsarecvex、wsagetlasterror都屬於winsock 1.1規范的函數;
頭文件:winsock2.h
庫:ws2_32.lib
mswsock.h用於編程擴展,使用時必須鏈接mswsock.dll
(4)c語言通信庫擴展閱讀
winsock庫的載入與卸載:
載入:int wsastartup(word wversionrequested, lpwsadata lpwsadata);
載入成功,返回值為0。
word wversionrequested:載入的winsock版本,使用宏makeword(x, y),x表示高位元組,y表示低位元組。然而使用時makeword(2, 2)。高位元組與低位元組相同~~
lpwsadata lpwsadata:wsadata結構的指針,傳入參數後,系統幫助我們填充版本信息。有興趣的可以看看結構體內容,不過基本用不著。
卸載:int wsacleanup(void);比起載入,卸載的函數真是輕松愉快。